PyXB-1.2.6/0000755000175000017500000000000013152762244011676 5ustar pabpab00000000000000PyXB-1.2.6/README.txt.in0000644000175000017500000000131013152762205013771 0ustar pabpab00000000000000PyXB -- Python W3C XML Schema Bindings Version @VERSION@ The source releases includes pre-built bundles for common XML namespaces, assorted web service namespaces, and SAML. A bundle with over 75 namespaces related to Geographic Information Systems is also available; if you want those, read pyxb/bundles/opengis/README.txt before installing PyXB. Installation: python setup.py install Documentation: doc/html or https://pabigot.github.io/pyxb/ Help Forum: http://sourceforge.net/forum/forum.php?forum_id=956708 Mailing list: https://lists.sourceforge.net/lists/listinfo/pyxb-users Archive: http://www.mail-archive.com/pyxb-users@lists.sourceforge.net Bug reports: https://github.com/pabigot/pyxb/issues PyXB-1.2.6/doc/0000755000175000017500000000000013152762244012443 5ustar pabpab00000000000000PyXB-1.2.6/doc/limitations.txt0000644000175000017500000000533713152762205015545 0ustar pabpab00000000000000Limitations *********** Things That Work ---------------- * Class constants corresponding to string enumeration constraints * Simple and complex type definitions * List and union datatypes * Constraints on (simple) datatypes (e.g., minInclusive, length) * Model groups and attribute groups * Complex content models (all, sequence, choice); minOccurs and maxOccurs * Abstract types, `xsi:type `_, substitution groups * Nillable elements with `xsi:nil `_ * Namespace qualified attributes and elements * Documentation annotations present in the schema are converted to Python docstrings in the generated bindings. * Pattern constraints (as long as the simple type derives from something that is represented as a Python string) Things That Don't Work ---------------------- ...but could someday ^^^^^^^^^^^^^^^^^^^^ * Identity constraints ("key", "unique", "keyref") are stored in the content model, but are not used. * `Wildcard elements `_ are supported in the sense that classes that enable them in the content model provide access to unrecognized values through the :py:obj:`pyxb.binding.basis.complexTypeDefinition.wildcardElements` method. Where the type of the node is recognized, it is converted to a Python binding instance; otherwise, the xml DOM instance is stored. Although namespace constraints are applied when checking for wildcard matches, the process contents attribute of the wildcard is ignored. * `Wildcard attributes `_ are supported in much the same sense as wildcard elements: no constraints are checked, and all are aggregated into the :py:obj:`pyxb.binding.basis.complexTypeDefinition.wildcardAttributeMap`. Values are uninterpreted Unicode strings. ...and probably never will ^^^^^^^^^^^^^^^^^^^^^^^^^^ * The `redefine directive `_ is not supported. * The ability to use templates to customize binding generation was promised in the vision document, but after three years of no plausible use case it is no longer part of the plan. Things That Mostly Work, But They're Ugly ----------------------------------------- * The `duration `_ type is based on the Python ``datetime.timedelta`` class, which works reasonably well for small deltas but does not handle month and year deltas. The PyXB version records that information, but the ``timedelta`` functionality (adding/substracting from ``datetime`` instances) does not incorporate that portion of the delta. Negative durations also may not work properly. PyXB-1.2.6/doc/bundles.txt0000644000175000017500000007543313152762205014651 0ustar pabpab00000000000000.. _bundles: Examples of Supported Schema ============================ PyXB comes with pre-defined *bundles* which aggregate related namespaces into pre-generated bindings that allow you to use them without having to generate and manage them yourself. These bundles also demonstrate the complexity of schema that PyXB is prepared to handle. Not all namespaces have been fully tested, but they are expected to function correctly. Although the generating scripts and infrastructure are part of PyXB proper, not all these bundles may have been pre-built in your PyXB distribution. See `Generating Bundled Bindings`_ for details on building these bundles. .. _bundle_common: common ------ The following namespaces are available in support of general XML use: .. PYXB_ARCHIVE_PATH=${PYXB_ROOT}/pyxb/bundles/common// ${PYXB_ROOT}/scripts/pyxbdump \ | awk '$2~/pyxb.bundles.common/ { print $2, $1; }' \ | sed \ -e 's@^@``@' \ -e 's@ @``\t``@' \ -e 's@$@``@' \ | expand -40 \ | sort \ > /tmp/x ===================================== ========================================================== Binding Module Namespace ===================================== ========================================================== ``pyxb.bundles.common.xhtml1`` ``http://www.w3.org/1999/xhtml`` ``pyxb.bundles.common.xlink`` ``http://www.w3.org/1999/xlink`` ``pyxb.bundles.common.xsd_hfp`` ``http://www.w3.org/2001/XMLSchema-hasFacetAndProperty`` ===================================== ========================================================== .. _bundle_wssplat: WS-* ---- The following namespaces are available in support of web service development: .. PYXB_ARCHIVE_PATH=${PYXB_ROOT}/pyxb/bundles/wssplat// ${PYXB_ROOT}/scripts/pyxbdump \ | awk '$2~/pyxb.bundles.wssplat/ { print $2, $1; }' \ | sed \ -e 's@^@``@' \ -e 's@ @``\t``@' \ -e 's@$@``@' \ | expand -40 \ | sort \ > /tmp/x ===================================== ========================================================== Binding Module Namespace ===================================== ========================================================== ``pyxb.bundles.wssplat.bpws`` ``http://schemas.xmlsoap.org/ws/2003/03/business-process/`` ``pyxb.bundles.wssplat.ds`` ``http://www.w3.org/2000/09/xmldsig#`` ``pyxb.bundles.wssplat.httpbind`` ``http://schemas.xmlsoap.org/wsdl/http/`` ``pyxb.bundles.wssplat.mimebind`` ``http://schemas.xmlsoap.org/wsdl/mime/`` ``pyxb.bundles.wssplat.sawsdl`` ``http://www.w3.org/ns/sawsdl`` ``pyxb.bundles.wssplat.soap11`` ``http://schemas.xmlsoap.org/soap/envelope/`` ``pyxb.bundles.wssplat.soap12`` ``http://www.w3.org/2003/05/soap-envelope`` ``pyxb.bundles.wssplat.soapbind11`` ``http://schemas.xmlsoap.org/wsdl/soap/`` ``pyxb.bundles.wssplat.soapbind12`` ``http://schemas.xmlsoap.org/wsdl/soap12/`` ``pyxb.bundles.wssplat.soapenc`` ``http://schemas.xmlsoap.org/soap/encoding/`` ``pyxb.bundles.wssplat.whttp`` ``http://www.w3.org/ns/wsdl/http`` ``pyxb.bundles.wssplat.wsa`` ``http://www.w3.org/2005/08/addressing`` ``pyxb.bundles.wssplat.wsam`` ``http://www.w3.org/2007/02/addressing/metadata`` ``pyxb.bundles.wssplat.wscoor`` ``http://docs.oasis-open.org/ws-tx/wscoor/2006/06`` ``pyxb.bundles.wssplat.wsdl11`` ``http://schemas.xmlsoap.org/wsdl/`` ``pyxb.bundles.wssplat.wsdl20`` ``http://www.w3.org/ns/wsdl`` ``pyxb.bundles.wssplat.wsdli`` ``http://www.w3.org/ns/wsdl-instance`` ``pyxb.bundles.wssplat.wsdlx`` ``http://www.w3.org/ns/wsdl-extensions`` ``pyxb.bundles.wssplat.wsnt`` ``http://docs.oasis-open.org/wsn/b-2`` ``pyxb.bundles.wssplat.wsoap`` ``http://www.w3.org/ns/wsdl/soap`` ``pyxb.bundles.wssplat.wsp200607`` ``http://www.w3.org/2006/07/ws-policy`` ``pyxb.bundles.wssplat.wsp`` ``http://www.w3.org/ns/ws-policy`` ``pyxb.bundles.wssplat.wsrf_bf`` ``http://docs.oasis-open.org/wsrf/bf-2`` ``pyxb.bundles.wssplat.wsrf_br`` ``http://docs.oasis-open.org/wsn/br-2`` ``pyxb.bundles.wssplat.wsrm`` ``http://docs.oasis-open.org/ws-rx/wsrm/200702`` ``pyxb.bundles.wssplat.wsse`` ``http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd`` ``pyxb.bundles.wssplat.wstop`` ``http://docs.oasis-open.org/wsn/t-1`` ``pyxb.bundles.wssplat.wsu`` ``http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd`` ``pyxb.bundles.wssplat.xenc`` ``http://www.w3.org/2001/04/xmlenc#`` ===================================== ========================================================== .. _bundle_saml20: SAML ---- The following namespaces are available in support of the `Security Assertion Markup Language `_: .. PYXB_ARCHIVE_PATH=${PYXB_ROOT}/pyxb/bundles/saml20// ${PYXB_ROOT}/scripts/pyxbdump \ | awk '$2~/pyxb.bundles.saml20/ { print $2, $1; }' \ | sed \ -e 's@^@``@' \ -e 's@ @``\t``@' \ -e 's@$@``@' \ | expand -40 \ | sort \ > /tmp/x ===================================== ========================================================== Binding Module Namespace ===================================== ========================================================== ``pyxb.bundles.saml20.assertion`` ``urn:oasis:names:tc:SAML:2.0:assertion`` ``pyxb.bundles.saml20.dce`` ``urn:oasis:names:tc:SAML:2.0:profiles:attribute:DCE`` ``pyxb.bundles.saml20.ecp`` ``urn:oasis:names:tc:SAML:2.0:profiles:SSO:ecp`` ``pyxb.bundles.saml20.metadata`` ``urn:oasis:names:tc:SAML:2.0:metadata`` ``pyxb.bundles.saml20.protocol`` ``urn:oasis:names:tc:SAML:2.0:protocol`` ``pyxb.bundles.saml20.x500`` ``urn:oasis:names:tc:SAML:2.0:profiles:attribute:X500`` ``pyxb.bundles.saml20.xacml`` ``urn:oasis:names:tc:SAML:2.0:profiles:attribute:XACML`` ===================================== ========================================================== .. _bundle_dc: Dublin Core ----------- The following namespaces are available in support of the `Dublin Core(R) Metadata Initiative `_. .. PYXB_ARCHIVE_PATH=${PYXB_ROOT}/pyxb/bundles/dc// ${PYXB_ROOT}/scripts/pyxbdump \ | awk '$2~/pyxb.bundles.dc/ { print $2, $1; }' \ | sed \ -e 's@^@``@' \ -e 's@ @``\t``@' \ -e 's@$@``@' \ | expand -40 \ | sort \ > /tmp/x ===================================== ========================================================== Binding Module Namespace ===================================== ========================================================== ``pyxb.bundles.dc.dc`` ``http://purl.org/dc/elements/1.1/`` ``pyxb.bundles.dc.dcmitype`` ``http://purl.org/dc/dcmitype/`` ``pyxb.bundles.dc.dcterms`` ``http://purl.org/dc/terms/`` ===================================== ========================================================== .. _bundle_ecma376: ECMA-376 (Open Office XML) -------------------------- `ECMA 376 `_ aka "Office Open XML" aka "ISO/IEC 29500" is a standard for XML-based office software suite documents, including Microsoft Office 2007 and 2010. This bundle is not populated in the distributed versions of PyXB because it requires some 250MB of space to hold the schemas, generated bindings, and archive files. To build it, set ``PYXB_ROOT`` environment variable to the absolute path of the unpacked PyXB distribution (the directory containing :file:`setup.py`) and run these commands:: cd ${PYXB_ROOT} pyxb/bundles/ecma376/scripts/genbind This will download the schemas from OGC and generate bindings for both sets of namespaces below. Note that there are two incompatible schema sets which share namespaces. Import only one. If you wish to extend the classes in these namespaces, ensure your ``PYXB_ARCHIVE_PATH`` includes only the one you intend to extend. ECMA-376 1st Edition (2006) ^^^^^^^^^^^^^^^^^^^^^^^^^^^ The first edition of ECMA-376 was a transitional version leading to ISO/IEC 29500, but is not compatible with that standard. It may be needed for older documents, including those processed by Microsoft Office 2007. .. PYXB_ARCHIVE_PATH=${PYXB_ROOT}/pyxb/bundles/ecma376/v2006// ${PYXB_ROOT}/scripts/pyxbdump \ | awk '$2~/pyxb.bundles.ecma376.v2006/ { print $2, $1; }' \ | sed \ -e 's@^@``@' \ -e 's@ @``\t``@' \ -e 's@$@``@' \ | expand -70 \ | sort \ > /tmp/x ==================================================================== ========================================================== Binding Module Namespace ==================================================================== ========================================================== ``pyxb.bundles.ecma376.v2006.dml.audioVideo`` ``http://schemas.openxmlformats.org/drawingml/2006/main`` ``pyxb.bundles.ecma376.v2006.dml.chartDrawing`` ``http://schemas.openxmlformats.org/drawingml/2006/chartDrawing`` ``pyxb.bundles.ecma376.v2006.dml.chart`` ``http://schemas.openxmlformats.org/drawingml/2006/chart`` ``pyxb.bundles.ecma376.v2006.dml.compatibility`` ``http://schemas.openxmlformats.org/drawingml/2006/compatibility`` ``pyxb.bundles.ecma376.v2006.dml.diagramColorTransform`` ``http://schemas.openxmlformats.org/drawingml/2006/diagram`` ``pyxb.bundles.ecma376.v2006.dml.lockedCanvas`` ``http://schemas.openxmlformats.org/drawingml/2006/lockedCanvas`` ``pyxb.bundles.ecma376.v2006.dml.picture`` ``http://schemas.openxmlformats.org/drawingml/2006/picture`` ``pyxb.bundles.ecma376.v2006.dml.spreadsheetDrawing`` ``http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing`` ``pyxb.bundles.ecma376.v2006.dml.wordprocessingDrawing`` ``http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing`` ``pyxb.bundles.ecma376.v2006.opc.contentTypes`` ``http://schemas.openxmlformats.org/package/2006/content-types`` ``pyxb.bundles.ecma376.v2006.opc.coreProperties`` ``http://schemas.openxmlformats.org/package/2006/metadata/core-properties`` ``pyxb.bundles.ecma376.v2006.opc.digSig`` ``http://schemas.openxmlformats.org/package/2006/digital-signature`` ``pyxb.bundles.ecma376.v2006.opc.relationships`` ``http://schemas.openxmlformats.org/package/2006/relationships`` ``pyxb.bundles.ecma376.v2006.pml.animationInfo`` ``http://schemas.openxmlformats.org/presentationml/2006/main`` ``pyxb.bundles.ecma376.v2006.shared.additionalCharacteristics`` ``http://schemas.openxmlformats.org/officeDocument/2006/characteristics`` ``pyxb.bundles.ecma376.v2006.shared.bibliography`` ``http://schemas.openxmlformats.org/officeDocument/2006/bibliography`` ``pyxb.bundles.ecma376.v2006.shared.customXmlDataProperties`` ``http://schemas.openxmlformats.org/officeDocument/2006/customXml`` ``pyxb.bundles.ecma376.v2006.shared.customXmlSchemaProperties`` ``http://schemas.openxmlformats.org/schemaLibrary/2006/main`` ``pyxb.bundles.ecma376.v2006.shared.documentPropertiesCustom`` ``http://schemas.openxmlformats.org/officeDocument/2006/custom-properties`` ``pyxb.bundles.ecma376.v2006.shared.documentPropertiesExtended`` ``http://schemas.openxmlformats.org/officeDocument/2006/extended-properties`` ``pyxb.bundles.ecma376.v2006.shared.documentPropertiesVariantTypes`` ``http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes`` ``pyxb.bundles.ecma376.v2006.shared.math`` ``http://schemas.openxmlformats.org/officeDocument/2006/math`` ``pyxb.bundles.ecma376.v2006.shared.relationshipReference`` ``http://schemas.openxmlformats.org/officeDocument/2006/relationships`` ``pyxb.bundles.ecma376.v2006.sml.autoFilter`` ``http://schemas.openxmlformats.org/spreadsheetml/2006/main`` ``pyxb.bundles.ecma376.v2006.vml.main`` ``urn:schemas-microsoft-com:vml`` ``pyxb.bundles.ecma376.v2006.vml.officeDrawing`` ``urn:schemas-microsoft-com:office:office`` ``pyxb.bundles.ecma376.v2006.vml.presentationDrawing`` ``urn:schemas-microsoft-com:office:powerpoint`` ``pyxb.bundles.ecma376.v2006.vml.spreadsheetDrawing`` ``urn:schemas-microsoft-com:office:excel`` ``pyxb.bundles.ecma376.v2006.vml.wordprocessingDrawing`` ``urn:schemas-microsoft-com:office:word`` ``pyxb.bundles.ecma376.v2006.wml`` ``http://schemas.openxmlformats.org/wordprocessingml/2006/main`` ==================================================================== ========================================================== ECMA-376 2e/3e/4e (2008) ^^^^^^^^^^^^^^^^^^^^^^^^ The ISO/IEC 29500:2008 version has distinct transitional and strict hierarchies. Use one or the other. The packaging schema are shared between these versions, and in fact appear to be unchanged from the 2006 schema except for comments and other whitespace in the schema documents. The various editions contain changes intended to increase conformance to ISO/IEC 29500:2008 and the bundle script is configured to build the 4th edition (December 2012). .. PYXB_ARCHIVE_PATH=${PYXB_ROOT}/pyxb/bundles/ecma376/v2008// ${PYXB_ROOT}/scripts/pyxbdump \ | awk '$2~/pyxb.bundles.ecma376.v2008/ { print $2, $1; }' \ | sed \ -e 's@^@``@' \ -e 's@ @``\t``@' \ -e 's@$@``@' \ | expand -82 \ | sort \ > /tmp/x ================================================================================= ========================================================== Binding Module Namespace ================================================================================= ========================================================== ``pyxb.bundles.ecma376.v2008.opc.contentTypes`` ``http://schemas.openxmlformats.org/package/2006/content-types`` ``pyxb.bundles.ecma376.v2008.opc.coreProperties`` ``http://schemas.openxmlformats.org/package/2006/metadata/core-properties`` ``pyxb.bundles.ecma376.v2008.opc.digSig`` ``http://schemas.openxmlformats.org/package/2006/digital-signature`` ``pyxb.bundles.ecma376.v2008.opc.relationships`` ``http://schemas.openxmlformats.org/package/2006/relationships`` ``pyxb.bundles.ecma376.v2008.strict.dml.chartDrawing`` ``http://purl.oclc.org/ooxml/drawingml/chartDrawing`` ``pyxb.bundles.ecma376.v2008.strict.dml.chart`` ``http://purl.oclc.org/ooxml/drawingml/chart`` ``pyxb.bundles.ecma376.v2008.strict.dml.diagram`` ``http://purl.oclc.org/ooxml/drawingml/diagram`` ``pyxb.bundles.ecma376.v2008.strict.dml.lockedCanvas`` ``http://purl.oclc.org/ooxml/drawingml/lockedCanvas`` ``pyxb.bundles.ecma376.v2008.strict.dml.main`` ``http://purl.oclc.org/ooxml/drawingml/main`` ``pyxb.bundles.ecma376.v2008.strict.dml.picture`` ``http://purl.oclc.org/ooxml/drawingml/picture`` ``pyxb.bundles.ecma376.v2008.strict.dml.spreadsheetDrawing`` ``http://purl.oclc.org/ooxml/drawingml/spreadsheetDrawing`` ``pyxb.bundles.ecma376.v2008.strict.dml.wordprocessingDrawing`` ``http://purl.oclc.org/ooxml/drawingml/wordprocessingDrawing`` ``pyxb.bundles.ecma376.v2008.strict.pml`` ``http://purl.oclc.org/ooxml/presentationml/main`` ``pyxb.bundles.ecma376.v2008.strict.shared.additionalCharacteristics`` ``http://purl.oclc.org/ooxml/officeDocument/characteristics`` ``pyxb.bundles.ecma376.v2008.strict.shared.bibliography`` ``http://purl.oclc.org/ooxml/officeDocument/bibliography`` ``pyxb.bundles.ecma376.v2008.strict.shared.commonSimpleTypes`` ``http://purl.oclc.org/ooxml/officeDocument/sharedTypes`` ``pyxb.bundles.ecma376.v2008.strict.shared.customXmlDataProperties`` ``http://purl.oclc.org/ooxml/officeDocument/customXml`` ``pyxb.bundles.ecma376.v2008.strict.shared.customXmlSchemaProperties`` ``http://purl.oclc.org/ooxml/schemaLibrary/main`` ``pyxb.bundles.ecma376.v2008.strict.shared.documentPropertiesCustom`` ``http://purl.oclc.org/ooxml/officeDocument/customProperties`` ``pyxb.bundles.ecma376.v2008.strict.shared.documentPropertiesExtended`` ``http://purl.oclc.org/ooxml/officeDocument/extendedProperties`` ``pyxb.bundles.ecma376.v2008.strict.shared.documentPropertiesVariantTypes`` ``http://purl.oclc.org/ooxml/officeDocument/docPropsVTypes`` ``pyxb.bundles.ecma376.v2008.strict.shared.math`` ``http://purl.oclc.org/ooxml/officeDocument/math`` ``pyxb.bundles.ecma376.v2008.strict.shared.relationshipReference`` ``http://purl.oclc.org/ooxml/officeDocument/relationships`` ``pyxb.bundles.ecma376.v2008.strict.sml`` ``http://purl.oclc.org/ooxml/spreadsheetml/main`` ``pyxb.bundles.ecma376.v2008.strict.wml`` ``http://purl.oclc.org/ooxml/wordprocessingml/main`` ``pyxb.bundles.ecma376.v2008.transitional.dml.chartDrawing`` ``http://schemas.openxmlformats.org/drawingml/2006/chartDrawing`` ``pyxb.bundles.ecma376.v2008.transitional.dml.chart`` ``http://schemas.openxmlformats.org/drawingml/2006/chart`` ``pyxb.bundles.ecma376.v2008.transitional.dml.diagram`` ``http://schemas.openxmlformats.org/drawingml/2006/diagram`` ``pyxb.bundles.ecma376.v2008.transitional.dml.lockedCanvas`` ``http://schemas.openxmlformats.org/drawingml/2006/lockedCanvas`` ``pyxb.bundles.ecma376.v2008.transitional.dml.main`` ``http://schemas.openxmlformats.org/drawingml/2006/main`` ``pyxb.bundles.ecma376.v2008.transitional.dml.picture`` ``http://schemas.openxmlformats.org/drawingml/2006/picture`` ``pyxb.bundles.ecma376.v2008.transitional.dml.spreadsheetDrawing`` ``http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing`` ``pyxb.bundles.ecma376.v2008.transitional.dml.wordprocessingDrawing`` ``http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing`` ``pyxb.bundles.ecma376.v2008.transitional.pml`` ``http://schemas.openxmlformats.org/presentationml/2006/main`` ``pyxb.bundles.ecma376.v2008.transitional.shared.additionalCharacteristics`` ``http://schemas.openxmlformats.org/officeDocument/2006/characteristics`` ``pyxb.bundles.ecma376.v2008.transitional.shared.bibliography`` ``http://schemas.openxmlformats.org/officeDocument/2006/bibliography`` ``pyxb.bundles.ecma376.v2008.transitional.shared.commonSimpleTypes`` ``http://schemas.openxmlformats.org/officeDocument/2006/sharedTypes`` ``pyxb.bundles.ecma376.v2008.transitional.shared.customXmlDataProperties`` ``http://schemas.openxmlformats.org/officeDocument/2006/customXml`` ``pyxb.bundles.ecma376.v2008.transitional.shared.customXmlSchemaProperties`` ``http://schemas.openxmlformats.org/schemaLibrary/2006/main`` ``pyxb.bundles.ecma376.v2008.transitional.shared.documentPropertiesCustom`` ``http://schemas.openxmlformats.org/officeDocument/2006/custom-properties`` ``pyxb.bundles.ecma376.v2008.transitional.shared.documentPropertiesExtended`` ``http://schemas.openxmlformats.org/officeDocument/2006/extended-properties`` ``pyxb.bundles.ecma376.v2008.transitional.shared.documentPropertiesVariantTypes`` ``http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes`` ``pyxb.bundles.ecma376.v2008.transitional.shared.math`` ``http://schemas.openxmlformats.org/officeDocument/2006/math`` ``pyxb.bundles.ecma376.v2008.transitional.shared.relationshipReference`` ``http://schemas.openxmlformats.org/officeDocument/2006/relationships`` ``pyxb.bundles.ecma376.v2008.transitional.sml`` ``http://schemas.openxmlformats.org/spreadsheetml/2006/main`` ``pyxb.bundles.ecma376.v2008.transitional.vml.main`` ``urn:schemas-microsoft-com:vml`` ``pyxb.bundles.ecma376.v2008.transitional.vml.officeDrawing`` ``urn:schemas-microsoft-com:office:office`` ``pyxb.bundles.ecma376.v2008.transitional.vml.presentationDrawing`` ``urn:schemas-microsoft-com:office:powerpoint`` ``pyxb.bundles.ecma376.v2008.transitional.vml.spreadsheetDrawing`` ``urn:schemas-microsoft-com:office:excel`` ``pyxb.bundles.ecma376.v2008.transitional.vml.wordprocessingDrawing`` ``urn:schemas-microsoft-com:office:word`` ``pyxb.bundles.ecma376.v2008.transitional.wml`` ``http://schemas.openxmlformats.org/wordprocessingml/2006/main`` ================================================================================= ========================================================== .. _bundle_opengis: OpenGIS ------- .. note:: As of PyXB 1.2.0, this bundle supports the version of the OGC Schema that use the W3C XLink 1.1 instead of the older OGC XLink schema. See http://www.opengeospatial.org/blog/1597 for more information about this change. The following namespaces are available in support of `Open Geospatial Consortium `_ Geographic Information System processing. Note that several of these namespaces are "private" bindings generated because the OGC definitions include their own schema for use local to another schema. The modules corresponding to these namespace uses begin with an underscore, and should generally not be used in other contexts. This bundle is not populated in the distributed versions of PyXB because it requires some 168MB of space to hold the schemas, generated bindings, and archive files. To build it, set ``PYXB_ROOT`` environment variable to the absolute path of the unpacked PyXB distribution (the directory containing :file:`setup.py`) and run these commands:: cd ${PYXB_ROOT} pyxb/bundles/opengis/scripts/genbind python setup.py install This will download the schemas from OGC, generate bindings for the namespaces below, and (re-)install PyXB including the new bindings. Other namespaces are available and can be added by modifying the ``genbind`` script and re-running the commands above. .. PYXB_ARCHIVE_PATH=${PYXB_ROOT}/pyxb/bundles/opengis// ${PYXB_ROOT}/scripts/pyxbdump \ | awk '$2~/pyxb.bundles.opengis/ { print $2, $1; }' \ | sed \ -e 's@^@``@' \ -e 's@ @``\t``@' \ -e 's@$@``@' \ | expand -50 \ | sort \ > /tmp/x ================================================ ========================================================== Binding Module Namespace ================================================ ========================================================== ``pyxb.bundles.opengis._ogc`` ``http://www.opengis.net/ogc`` ``pyxb.bundles.opengis._sam`` ``http://www.opengis.net/sampling/2.0`` ``pyxb.bundles.opengis._sams`` ``http://www.opengis.net/samplingSpatial/2.0`` ``pyxb.bundles.opengis.atom`` ``http://www.w3.org/2005/Atom`` ``pyxb.bundles.opengis.citygml.appearance`` ``http://www.opengis.net/citygml/appearance/1.0`` ``pyxb.bundles.opengis.citygml.base`` ``http://www.opengis.net/citygml/1.0`` ``pyxb.bundles.opengis.citygml.building`` ``http://www.opengis.net/citygml/building/1.0`` ``pyxb.bundles.opengis.citygml.cityFurniture`` ``http://www.opengis.net/citygml/cityfurniture/1.0`` ``pyxb.bundles.opengis.citygml.cityObjectGroup`` ``http://www.opengis.net/citygml/cityobjectgroup/1.0`` ``pyxb.bundles.opengis.citygml.generics`` ``http://www.opengis.net/citygml/generics/1.0`` ``pyxb.bundles.opengis.citygml.landUse`` ``http://www.opengis.net/citygml/landuse/1.0`` ``pyxb.bundles.opengis.citygml.relief`` ``http://www.opengis.net/citygml/relief/1.0`` ``pyxb.bundles.opengis.citygml.texturedSurface`` ``http://www.opengis.net/citygml/texturedsurface/1.0`` ``pyxb.bundles.opengis.citygml.transportation`` ``http://www.opengis.net/citygml/transportation/1.0`` ``pyxb.bundles.opengis.citygml.vegetation`` ``http://www.opengis.net/citygml/vegetation/1.0`` ``pyxb.bundles.opengis.citygml.waterBody`` ``http://www.opengis.net/citygml/waterbody/1.0`` ``pyxb.bundles.opengis.csw_2_0_2`` ``http://www.opengis.net/cat/csw/2.0.2`` ``pyxb.bundles.opengis.csw_dc`` ``http://purl.org/dc/elements/1.1/`` ``pyxb.bundles.opengis.csw_dct`` ``http://purl.org/dc/terms/`` ``pyxb.bundles.opengis.fes_2_0`` ``http://www.opengis.net/fes/2.0`` ``pyxb.bundles.opengis.filter`` ``http://www.opengis.net/ogc`` ``pyxb.bundles.opengis.gml_3_2`` ``http://www.opengis.net/gml/3.2`` ``pyxb.bundles.opengis.gml_3_3.ce`` ``http://www.opengis.net/gml/3.3/ce`` ``pyxb.bundles.opengis.gml_3_3.exr`` ``http://www.opengis.net/gml/3.3/exr`` ``pyxb.bundles.opengis.gml_3_3.lr`` ``http://www.opengis.net/gml/3.3/lr`` ``pyxb.bundles.opengis.gml_3_3.lro`` ``http://www.opengis.net/gml/3.3/lro`` ``pyxb.bundles.opengis.gml_3_3.lrov`` ``http://www.opengis.net/gml/3.3/lrov`` ``pyxb.bundles.opengis.gml_3_3.lrtr`` ``http://www.opengis.net/gml/3.3/lrtr`` ``pyxb.bundles.opengis.gml_3_3.rgrid`` ``http://www.opengis.net/gml/3.3/rgrid`` ``pyxb.bundles.opengis.gml_3_3.tin`` ``http://www.opengis.net/gml/3.3/tin`` ``pyxb.bundles.opengis.gml_3_3.xbt`` ``http://www.opengis.net/gml/3.3/xbt`` ``pyxb.bundles.opengis.gml`` ``http://www.opengis.net/gml`` ``pyxb.bundles.opengis.gmlsf`` ``http://www.opengis.net/gmlsf`` ``pyxb.bundles.opengis.ic_ism_2_1`` ``urn:us:gov:ic:ism:v2`` ``pyxb.bundles.opengis.iso19139.v20070417.gco`` ``http://www.isotc211.org/2005/gco`` ``pyxb.bundles.opengis.iso19139.v20070417.gmd`` ``http://www.isotc211.org/2005/gmd`` ``pyxb.bundles.opengis.iso19139.v20070417.gmx`` ``http://www.isotc211.org/2005/gmx`` ``pyxb.bundles.opengis.iso19139.v20070417.gsr`` ``http://www.isotc211.org/2005/gsr`` ``pyxb.bundles.opengis.iso19139.v20070417.gss`` ``http://www.isotc211.org/2005/gss`` ``pyxb.bundles.opengis.iso19139.v20070417.gts`` ``http://www.isotc211.org/2005/gts`` ``pyxb.bundles.opengis.misc.xAL`` ``urn:oasis:names:tc:ciq:xsdschema:xAL:2.0`` ``pyxb.bundles.opengis.ogckml22`` ``http://www.opengis.net/kml/2.2`` ``pyxb.bundles.opengis.om_1_0`` ``http://www.opengis.net/om/1.0`` ``pyxb.bundles.opengis.om_2_0`` ``http://www.opengis.net/om/2.0`` ``pyxb.bundles.opengis.oseo_1_0`` ``http://www.opengis.net/oseo/1.0`` ``pyxb.bundles.opengis.ows_1_1`` ``http://www.opengis.net/ows/1.1`` ``pyxb.bundles.opengis.ows_2_0`` ``http://www.opengis.net/ows/2.0`` ``pyxb.bundles.opengis.ows`` ``http://www.opengis.net/ows`` ``pyxb.bundles.opengis.sampling_1_0`` ``http://www.opengis.net/sampling/1.0`` ``pyxb.bundles.opengis.sensorML_1_0_1`` ``http://www.opengis.net/sensorML/1.0.1`` ``pyxb.bundles.opengis.smil20`` ``http://www.w3.org/2001/SMIL20/`` ``pyxb.bundles.opengis.smil20lang`` ``http://www.w3.org/2001/SMIL20/Language`` ``pyxb.bundles.opengis.sos_1_0`` ``http://www.opengis.net/sos/1.0`` ``pyxb.bundles.opengis.sos_2_0`` ``http://www.opengis.net/sos/2.0`` ``pyxb.bundles.opengis.swe_1_0_0`` ``http://www.opengis.net/swe/1.0`` ``pyxb.bundles.opengis.swe_1_0_1`` ``http://www.opengis.net/swe/1.0.1`` ``pyxb.bundles.opengis.swe_2_0`` ``http://www.opengis.net/swe/2.0`` ``pyxb.bundles.opengis.swes_2_0`` ``http://www.opengis.net/swes/2.0`` ``pyxb.bundles.opengis.tml`` ``http://www.opengis.net/tml`` ``pyxb.bundles.opengis.waterml`` ``http://www.opengis.net/waterml/2.0`` ``pyxb.bundles.opengis.wcs_1_1`` ``http://www.opengis.net/wcs/1.1`` ``pyxb.bundles.opengis.wfs`` ``http://www.opengis.net/wfs`` ``pyxb.bundles.opengis.wps_1_0_0`` ``http://www.opengis.net/wps/1.0.0`` ================================================ ========================================================== .. _bundle_layout: Layout of a Bundle Directory ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ The ``pyxb/bundles`` directory contains groups of bindings for related schema. These groups are called "bundles", and each subdirectory represents a particular bundle. With a bundle directory, the following are expected: - A ``scripts`` directory, containing an executable ``genbind`` which retrieves the schema and invokes ``pyxbgen`` to build the bindings - A ``schemas`` directory, into which the ``genbind`` script stores the schemas that were used to build the bindings - The Python module files for namespace modules. Normally these are :ref:`customization wrappers ` - A ``raw`` subdirectory, into which the generated bindings are placed. This directory is normally removed and recreated as a consequence of running genbind; don't expect anything in it to be persistent. - An ``examples`` directory, with programs that show how to use the capabilities in the bundle - A ``tests`` directory which validates customizations Generating Bundled Bindings ^^^^^^^^^^^^^^^^^^^^^^^^^^^ To create the support infrastructure for a particular bundle, set the ``PYXB_ROOT`` environment variable to the root of an unpacked PyXB distribution and run the ``scripts/genbind`` script in the bundle root. For example:: cd ${PYXB_ROOT} pyxb/bundles/wssplat/scripts/genbind will invoke the :manpage:`wget(1)` program to retrieve the XML schema for a variety of namespaces related to web services and then generate bindings and archive files for them. Generating bundles should be a one-time action for each release of PyXB. .. note:: Some servers, including http://www.w3.org, enforce an artificial delay in retrieving schema documents in order to encourage systems to use cached local copies. The :file:`genbind` infrastructure will cache the schemas it downloads, but running the generation scripts for the `common`_ bundle, and possibly others, may result in errors if the caches are removed and the scripts run too frequently. PyXB-1.2.6/doc/arch_content.txt0000644000175000017500000002277713152762205015667 0ustar pabpab00000000000000.. _contentModel: Content Model ============= PyXB's content model is used to complete the link between the :ref:`componentModel` and the :ref:`bindingModel`. These classes are the ones that: - determine what Python class attribute is used to store which XML element or attribute; - distinguish those elements that can occur at most once from those that require an aggregation; and - ensure that the ordering and occurrence constraints imposed by the XML `model group `_ are satisfied, when XML is converted to Python instances and vice-versa. Associating XML and Python Objects ---------------------------------- Most of the classes involved in the content model are in the :py:obj:`pyxb.binding.content` module. The relations among these classes are displayed in the following diagram. .. _cd_contentModel: .. image:: Images/ContentModel.jpg In the standard code generation template, both element and attribute values are stored in Python class fields. As noted in :ref:`binding_deconflictingNames` it is necessary to ensure an attribute and an element which have the same name in their containing complex type have distinct names in the Python class corresponding to that type. Use information for each of these is maintained in the type class. This use information comprises: - the original :py:obj:`name ` of the element/attribute in the XML - its :py:obj:`deconflicted name ` in Python - the private name by which the value is stored in the Python instance dictionary Other information is specific to the type of use. The :py:obj:`pyxb.binding.basis.complexTypeDefinition` retains maps from the component's name the attribute use or element use instance corresponding to the component's use. .. _attributeUse: Attribute Uses ^^^^^^^^^^^^^^ The information associated with an `attribute use `_ is recorded in an :py:obj:`pyxb.binding.content.AttributeUse` instance. This class provides: - The :py:obj:`name ` of the attribute - The :py:obj:`default value ` of the attribute - Whether the attribute value is :py:obj:`fixed ` - Whether the `attribute use `_ is :py:obj:`required ` or :py:obj:`prohibited ` - The :py:obj:`type ` of the attribute, as a subclass of :py:obj:`pyxb.binding.basis.simpleTypeDefinition` - Methods to :py:obj:`read `, :py:obj:`set `, and :py:obj:`reset ` the value of the attribute in a given binding instance. A :py:obj:`map ` is used to map from expanded names to AttributeUse instances. This map is defined within the class definition itself. .. _elementUse: Element Uses ^^^^^^^^^^^^ The element analog to an attribute use is an `element declaration `_, and the corresponding information is stored in a :py:obj:`pyxb.binding.content.ElementDeclaration` instance. This class provides: - The :py:obj:`element binding ` that defines the properties of the referenced element, including its type - Whether the use allows :py:obj:`multiple occurrences ` - The :py:obj:`default value ` of the element. Currently this is either C{None} or an empty list, depending on :py:obj:`pyxb.binding.content.ElementDeclaration.isPlural` - Methods to :py:obj:`read `, :py:obj:`set `, :py:obj:`append to ` (only for plural elements), and :py:obj:`reset ` the value of the element in a given binding instance - The :py:obj:`setOrAppend ` method, which is most commonly used to provide new content to a value A :py:obj:`map ` is used to map from expanded names to ElementDeclaration instances. This map is defined within the class definition itself. As mentioned before, when the same element name appears at multiple places within the element content the uses are collapsed into a single attribute on the complex type; thus the map is to the :py:obj:`ElementDeclaration `, not the :py:obj:`ElementUse `. .. _validating-content: Validating the Content Model ---------------------------- As of :ref:`PyXB 1.2.0 `, content validation is performed using the **Finite Automata with Counters (FAC)** data structure, as described in `Regular Expressions with Numerical Constraints and Automata with Counters `_, `Dag Hovland `_, Lecture Notes in Computer Science, 2009, Volume 5684, Theoretical Aspects of Computing - ICTAC 2009, Pages 231-245. This structure allows accurate validation of occurrence and order constraints without the complexity of the original back-tracking validation solution from :ref:`PyXB 1.1.1 ` and earlier. It also avoids the :ticket:`incorrect rejection of valid documents <112>` that (rarely) occurred with the greedy algorithm introduced in :ref:`PyXB 1.1.2 `. Conversion to this data structure also enabled the distinction between :py:obj:`element declaration ` and :py:obj:`element use ` nodes, allowing diagnostics to trace back to the element references in context. The data structures for the automaton and the configuration structure that represents a processing automaton are: .. image:: Images/FACAutomaton.jpg The implementation in PyXB is generally follows the description in the ICTAC 2009 paper. Calculation of first/follow sets has been enhanced to support term trees with more than two children per node. In addition, support for unordered catenation as required for the `"all" model group `_ is implemented by a state that maintains a distinct sub-automaton for each alternative, requiring a layered approach where executon of an automaton is suspended until the subordinate automaton has accepted and a transition out of it is encountered. For more information on the implementation, please see the :py:obj:`FAC module `. This module has been written to be independent of PyXB infrastructure, and may be re-used in other code in accordance with the :ref:`PyXB license `. FAC and the PyXB Content Model ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ As depicted in the :ref:`Content Model class diagram ` each complex type binding class has a :py:obj:`_Automaton ` which encodes the content model of the type as a Finite Automaton with Counters. This representation models the occurrence constraints and sub-element orders, referencing the specific element and wildcard uses as they appear in the schema. Each instance of a complex binding supports an :py:obj:`AutomatonConfiguration ` that is used to validate the binding content against the model. An :py:obj:`ElementUse ` instance is provided as the metadata for automaton states that correspond an element declaration in the schema. Similarly, a :py:obj:`WildcardUse ` instance is used as the metadata for automaton states that correspond to an instance of the `xs:any `_ wildcard schema component. Validation in the automaton delegates through the :py:obj:`SymbolMatch_mixin ` interface to see whether content in the form of a complex type binding instance is conformant to the restrictions on symbols associated with a particular state. When parsing, a transition taken results in the storage of the consumed symbol into the appropriate element attribute or wildcard list in the binding instance. In many cases, the transition from one state to a next is uniquely determined by the content; as long as this condition holds, the :py:obj:`AutomatonConfiguration ` instance retains a single underlying :py:obj:`FAC Configuration ` representing the current state. To generate the XML corresponding to a binding instance, the element and wildcard content of the instance are loaded into a Python dictionary, keyed by the :py:obj:`ElementDeclaration `. These subordinate elements are appended to a list of child nodes as transitions that recognize them are encountered. As of :ref:`PyXB 1.2.0 ` the first legal transition in the order imposed by the schema is taken, and there is no provision for influencing the order in the generated document when multiple orderings are valid. .. ignored ## Local Variables: ## fill-column:78 ## indent-tabs-mode:nil ## End: PyXB-1.2.6/doc/index.txt0000644000175000017500000001063713152762205014317 0ustar pabpab00000000000000.. PyXB documentation master file .. Sphinx standard indentations # with overline, for parts * with overline, for chapters =, for sections -, for subsections ^, for subsubsections ", for paragraphs .. role:: namespace(literal) ################################ PyXB: Python XML Schema Bindings ################################ PyXB ("pixbee") is a pure `Python `_ package that generates Python source code for classes that correspond to data structures defined by `XMLSchema `_. The generated classes support bi-directional conversion between `XML `_ documents and Python objects. In concept it is similar to `JAXB `_ for Java and `CodeSynthesis XSD `_ for C++. A :ref:`thirty_sec_example` is at the bottom of this page. Step-by-step examples are in :ref:`userReference`. ************ Getting Help ************ PyXB is distributed on `SourceForge `_ and `PyPI `_, but active development has moved to `Github `_. Inter-release updates will be available on github on the `next `_ branch of the PyXB repository. For support, consult the `Help Forum `_, or subscribe to and email the `mailing list `_. To file a bug report or see the status of defects reported against the current release, visit the `Github issues page `_. (Older defects were archived under Trac at SourceForge; the historical data was moved to the `SF ticket interface `_ when SourceForge stopped supporting hosted applications. Do not attempt to open new issues on SourceForge.) For a history of releases, see :ref:`releases`. ******** Contents ******** .. toctree:: :maxdepth: 2 overview examples releases architecture userref_index pyxb maintref .. _thirty_sec_example: ********************* Thirty Second Example ********************* An example of a program using PyXB to interact with a `web service `_ [*]_ using an automatically-generated module. First, retrieve the WSDL and generate the bindings:: llc[566]$ pyxbgen \ --wsdl-location=http://wsf.cdyne.com/WeatherWS/Weather.asmx?WSDL \ --module=weather \ --write-for-customization Retrieving WSDL from http://wsf.cdyne.com/WeatherWS/Weather.asmx?WSDL WARNING:pyxb.binding.basis:Unable to convert DOM node {http://www.w3.org/2001/XMLSchema}schema at Weather.asmx?WSDL[4:4] to binding PS urn:uuid:8292a36c-577f-11e4-b592-c8600024e903 WARNING:pyxb.binding.generate:Complex type {http://ws.cdyne.com/WeatherWS/}ArrayOfWeatherDescription renamed to ArrayOfWeatherDescription_ WARNING:pyxb.binding.generate:Complex type {http://ws.cdyne.com/WeatherWS/}ForecastReturn renamed to ForecastReturn_ WARNING:pyxb.binding.generate:Complex type {http://ws.cdyne.com/WeatherWS/}WeatherReturn renamed to WeatherReturn_ Python for http://ws.cdyne.com/WeatherWS/ requires 1 modules Then write a program that uses them: .. literalinclude:: ../examples/weather/client_get.py And run it:: llc[567]$ python client_get.py Weather forecast for Saint Paul, MN: Wednesday, August 13 2014: Partly Cloudy, from 63 to 83 Thursday, August 14 2014: Partly Cloudy, from 61 to 82 Friday, August 15 2014: Partly Cloudy, from 65 to 86 Saturday, August 16 2014: Partly Cloudy, from 67 to 84 Sunday, August 17 2014: Partly Cloudy, from 67 to 82 Monday, August 18 2014: Partly Cloudy, from 67 to 83 Tuesday, August 19 2014: Partly Cloudy, from 65 to 84 That's it. .. [*] **Note**: Sometime between 2014 and 2017 the CDYNE Weather Service disappeared, although as of 2017-05-13 the link to its description above was still present. If you care about weather, there is a more complex example interfacing with the `National Digital Forecast Database `_ in the ``examples/ndfd`` directory. ****************** Indices and tables ****************** * :ref:`genindex` * :ref:`search` .. ignored ## Local Variables: ## fill-column:78 ## indent-tabs-mode:nil ## End: PyXB-1.2.6/doc/overview_what.txt0000644000175000017500000000256413152762205016101 0ustar pabpab00000000000000What Is PyXB? ============= PyXB is a pure `Python `_ package that generates Python code for classes that correspond to data structures defined by `XMLSchema `_. In concept it is similar to `JAXB `_ for Java and `CodeSynthesis XSD `_ for C++. The major goals of PyXB are: * Provide a generated Python interface that is "Pythonic", meaning similar to one that would have been hand-written: + Attributes and elements are Python properties, with name conflicts resolved in favor of elements + Elements with maxOccurs larger than 1 are stored as Python lists + Bindings for type extensions inherit from the binding for the base type + Enumeration constraints are exposed as class (constant) variables * Support bi-directional conversion (document to Python and back) * Allow easy customization of the generated bindings to provide functionality along with content * Support all XMLSchema features that are in common use, including: + complex content models (nested all/choice/sequence) + cross-namespace dependencies + include and import directives + constraints on simple types * Validate the documents against their schema Secondary goals, some of which have been achieved in the current release, are listed in :ref:`pyxb_vision`. PyXB-1.2.6/doc/userref_index.txt0000644000175000017500000000025313152762205016043 0ustar pabpab00000000000000.. _userReference: ************** User Reference ************** .. toctree:: :maxdepth: 2 userref_pyxbgen userref_usebind userref_validating pyxbgen_cli PyXB-1.2.6/doc/Makefile0000644000175000017500000000277413152762205014112 0ustar pabpab00000000000000# Makefile for Sphinx documentation # # You can set these variables from the command line. SPHINXOPTS = SPHINXBUILD = sphinx-build PAPER = # Internal variables. PAPEROPT_a4 = -D latex_paper_size=a4 PAPEROPT_letter = -D latex_paper_size=letter ALLSPHINXOPTS = -d _build/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . .PHONY: help clean html dirhtml pickle json htmlhelp qthelp latex changes linkcheck doctest help: @echo "Please use \`make ' where is one of" @echo " html to make standalone HTML files" @echo " dirhtml to make HTML files named index.html in directories" @echo " pickle to make pickle files" @echo " json to make JSON files" @echo " htmlhelp to make HTML files and a HTML help project" @echo " qthelp to make HTML files and a qthelp project" @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" @echo " changes to make an overview of all changed/added/deprecated items" @echo " linkcheck to check all external links for integrity" @echo " doctest to run all doctests embedded in the documentation (if enabled)" pyxbgen_cli.txt: ../pyxb/binding/generate.py ../maintainer/gendoc PYTHONPATH=.. ../maintainer/gendoc \ | sed -e 's@ *$$@@' -e '$${/^$$/d;}' \ > $@ GENERATED_TXT += pyxbgen_cli.txt html: $(GENERATED_TXT) PYTHONPATH=.:.. $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) html @echo @echo "Build finished. The HTML pages are in _build/html." clean: -rm -rf html _build ${GENERATED_TXT} PyXB-1.2.6/doc/pyxbgen_cli.txt0000644000175000017500000004326413152762205015515 0ustar pabpab00000000000000.. _pyxbgen-cli: ``pyxbgen`` Command Line Options ================================ Generic Options --------------- .. table:: Generic Options ============= ========= ====== ================================================== Long Option Argument Alt Description ============= ========= ====== ================================================== ``--version`` :ref:`show program's version number and exit` ``--help`` ``-h`` :ref:`show this help message and exit` ============= ========= ====== ================================================== .. _pyxbgen--version: ``--version`` ^^^^^^^^^^^^^ show program's version number and exit .. _pyxbgen--help: ``--help`` ^^^^^^^^^^ show this help message and exit Identifying Schema ------------------ Specify and locate schema for which bindings should be generated. .. table:: Identifying Schema =================================== ============= ====== ================================================== Long Option Argument Alt Description =================================== ============= ====== ================================================== ``--schema-location`` *FILE_or_URL* ``-u`` :ref:`Add the location of an entrypoint schema. The...` ``--schema-root`` *DIRECTORY* :ref:`The directory from which entrypoint schemas...` ``--schema-stripped-prefix`` *TEXT* :ref:`Optional string that is stripped from the...` ``--location-prefix-rewrite`` *TEXT* :ref:`Add a rewrite entry for schema locations....` ``--uri-content-archive-directory`` *DIRECTORY* :ref:`The directory path into which any content...` =================================== ============= ====== ================================================== .. _pyxbgen--schema-location: ``--schema-location`` ^^^^^^^^^^^^^^^^^^^^^ Add the location of an entrypoint schema. The provided value should be a URL; if it does not have a URL scheme (e.g., ``http:``), it is assumed to be a file, and if it is not an absolute path is located relative to the ``schemaRoot``. .. _pyxbgen--schema-root: ``--schema-root`` ^^^^^^^^^^^^^^^^^ The directory from which entrypoint schemas specified as relative file paths will be read. .. _pyxbgen--schema-stripped-prefix: ``--schema-stripped-prefix`` ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Optional string that is stripped from the beginning of schemaLocation values before loading from them. This now applies only to URIs specified on the command line so is unlikely to be useful. .. _pyxbgen--location-prefix-rewrite: ``--location-prefix-rewrite`` ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Add a rewrite entry for schema locations. Parameter values are strings of the form ``pfx=sub``. The effect is that a schema location that begins with ``pfx`` is rewritten so that it instead begins with ``sub``. This applies to schemaLocation attributes in ``import`` and ``include`` elements. It may be used to convert absolute schema locations into relative ones to allow offline processing when all schema are available in a local directory. See ``schemaRoot``. .. _pyxbgen--uri-content-archive-directory: ``--uri-content-archive-directory`` ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ The directory path into which any content retrieved by URI will be written. This serves as a local cache, and to give you an opportunity to inspect material retrieved from some other system. @rtype: ``str`` Configuring Bindings -------------------- Specify where generated bindings should be written, and how they will be accessed from Python. .. table:: Configuring Bindings ================================ =========== ====== ================================================== Long Option Argument Alt Description ================================ =========== ====== ================================================== ``--module`` *MODULE* ``-m`` :ref:`Add a module name corresponding to an entrypoint...` ``--module-prefix`` *MODULE* :ref:`The prefix for binding modules. The base name for...` ``--binding-root`` *DIRECTORY* :ref:`The directory path into which generated bindings...` ``--write-for-customization`` ``-r`` :ref:`Indicates whether the binding Python code should...` ``--no-write-for-customization`` :ref:`Indicates whether the binding Python code should...` ================================ =========== ====== ================================================== .. _pyxbgen--module: ``--module`` ^^^^^^^^^^^^ Add a module name corresponding to an entrypoint schema. The namespace defined by the corresponding schema will be written to a binding using the given module name, adjusted by L{modulePrefix}. .. _pyxbgen--module-prefix: ``--module-prefix`` ^^^^^^^^^^^^^^^^^^^ The prefix for binding modules. The base name for the module holding a binding is taken from the moduleList, moduleMap, or an XMLNS prefix associated with the namespace in a containing schema. This value, if present, is used as a prefix to allow a deeper module hierarchy. .. _pyxbgen--binding-root: ``--binding-root`` ^^^^^^^^^^^^^^^^^^ The directory path into which generated bindings will be written. @rtype: ``str`` .. _pyxbgen--write-for-customization: ``--write-for-customization`` ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Indicates whether the binding Python code should be written into a sub- module for customization. If enabled, a module ``path.to.namespace`` will be written to the file ``path/to/raw/namespace.py``, so that the file ``path/to/namespace.py`` can import it and override behavior. This option turns on the feature. .. _pyxbgen--no-write-for-customization: ``--no-write-for-customization`` ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Indicates whether the binding Python code should be written into a sub- module for customization. If enabled, a module ``path.to.namespace`` will be written to the file ``path/to/raw/namespace.py``, so that the file ``path/to/namespace.py`` can import it and override behavior. This option turns off the feature (*default*). Reading Namespace Archives -------------------------- Locating and loading (or inhibiting load of) namespace archives. .. table:: Reading Namespace Archives ================================== ========= ==== ================================================== Long Option Argument Alt Description ================================== ========= ==== ================================================== ``--archive-path`` *PATH* :ref:`A colon-separated list of paths from which...` ``--import-augmentable-namespace`` *URI* :ref:`Mark that the specified namespace may be imported...` ``--no-load-namespace`` *URI* :ref:`Mark that the specified namespace should not be...` ================================== ========= ==== ================================================== .. _pyxbgen--archive-path: ``--archive-path`` ^^^^^^^^^^^^^^^^^^ A colon-separated list of paths from which namespace archives can be read. The default path is the contents of the ``PYXB_ARCHIVE_PATH`` environment variable, or the standard path configured at installation time. Any file with the extension ``.wxs`` found in one of these directories is examined to see whether it is a namespace archive. .. _pyxbgen--import-augmentable-namespace: ``--import-augmentable-namespace`` ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Mark that the specified namespace may be imported by new bindings. Normally namespaces that are available from archives are considered to be complete, and schema locations in import directives are ignored. Use this to indicate that the bindings being generated import new bindings. Note that attempts to import schema that contributed to the archive will only be detected if the archive was generated from the same schemaLocation URI; if the archive was generated from a different source component definitions might conflict. .. _pyxbgen--no-load-namespace: ``--no-load-namespace`` ^^^^^^^^^^^^^^^^^^^^^^^ Mark that the specified namespace should not be loaded from an archive. Use this when you are generating bindings for an application that has a restricted profile of a namespace that would otherwise be read from an archive. Be aware that this removes any knowledge of any archive in which this namespace is present as a non-private member. Writing Namespace Archives -------------------------- Control the location and content of a namespace archive corresponding to a binding generation. .. table:: Writing Namespace Archives =============================== ========= ==== ================================================== Long Option Argument Alt Description =============================== ========= ==== ================================================== ``--archive-to-file`` *FILE* :ref:`Optional file into which the archive of namespaces...` ``--public-namespace`` *URI* :ref:`Indicates, for specific namespaces, whether their...` ``--private-namespace`` *URI* :ref:`Indicates, for specific namespaces, whether their...` ``--default-namespace-public`` :ref:`Indicates whether unmentioned namespaces will be...` ``--default-namespace-private`` :ref:`Indicates whether unmentioned namespaces will be...` =============================== ========= ==== ================================================== .. _pyxbgen--archive-to-file: ``--archive-to-file`` ^^^^^^^^^^^^^^^^^^^^^ Optional file into which the archive of namespaces will be written. Subsequent generation actions can read pre-parsed namespaces from this file, and therefore reference the bindings that were built earlier rather than re-generating them. The file name should normally end with ``.wxs``. .. _pyxbgen--public-namespace: ``--public-namespace`` ^^^^^^^^^^^^^^^^^^^^^^ Indicates, for specific namespaces, whether their visibility in the archive should be public or private. This option adds the namespace as a public archive member. .. _pyxbgen--private-namespace: ``--private-namespace`` ^^^^^^^^^^^^^^^^^^^^^^^ Indicates, for specific namespaces, whether their visibility in the archive should be public or private. This option adds the namespace as a private archive member. .. _pyxbgen--default-namespace-public: ``--default-namespace-public`` ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Indicates whether unmentioned namespaces will be public or private (default) in the archive. A namespace is *mentioned* if it is the target namespace of an entrypoint schema, or appears in a namespace visibility specification. I.e., this default applies only to namespaces that are modified as a result of including some schema, which is generally a local customization of something. This option makes the default ``public`` (*default*). .. _pyxbgen--default-namespace-private: ``--default-namespace-private`` ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Indicates whether unmentioned namespaces will be public or private (default) in the archive. A namespace is *mentioned* if it is the target namespace of an entrypoint schema, or appears in a namespace visibility specification. I.e., this default applies only to namespaces that are modified as a result of including some schema, which is generally a local customization of something. This option makes the default ``private``. Configuring Binding Code Generation ----------------------------------- Control the style and content of the generated bindings. This is not well-supported, and you are advised to pretend these options don't exist. .. table:: Configuring Binding Code Generation ========================= ========= ==== ================================================== Long Option Argument Alt Description ========================= ========= ==== ================================================== ``--validate-changes`` :ref:`Indicates whether the bindings should validate...` ``--no-validate-changes`` :ref:`Indicates whether the bindings should validate...` ========================= ========= ==== ================================================== .. _pyxbgen--validate-changes: ``--validate-changes`` ^^^^^^^^^^^^^^^^^^^^^^ Indicates whether the bindings should validate mutations against the content model. This option turns on validation (default). .. _pyxbgen--no-validate-changes: ``--no-validate-changes`` ^^^^^^^^^^^^^^^^^^^^^^^^^ Indicates whether the bindings should validate mutations against the content model. This option turns off validation. Miscellaneous Options --------------------- Anything else. .. table:: Miscellaneous Options ========================= ========= ==== ================================================== Long Option Argument Alt Description ========================= ========= ==== ================================================== ``--logging-config-file`` *FILE* :ref:`A file provided to L{logging.config.fileConfig} to...` ========================= ========= ==== ================================================== .. _pyxbgen--logging-config-file: ``--logging-config-file`` ^^^^^^^^^^^^^^^^^^^^^^^^^ A file provided to L{logging.config.fileConfig} to control log messages. In the absence of other configuration the Python standard logging infrastructure is used in its default configuration. @rtype: ``str`` Maintainer Options ------------------ Don't use these. They don't exist. If they did, they'd do different things at different times, and if you used them you'd probably be sorry. .. table:: Maintainer Options ================================= ========= ==== ================================================== Long Option Argument Alt Description ================================= ========= ==== ================================================== ``--allow-absent-module`` :ref:`Indicates whether the code generator is permitted...` ``--no-allow-absent-module`` :ref:`Indicates whether the code generator is permitted...` ``--allow-builtin-generation`` :ref:`Indicates whether bindings will be written for...` ``--no-allow-builtin-generation`` :ref:`Indicates whether bindings will be written for...` ================================= ========= ==== ================================================== .. _pyxbgen--allow-absent-module: ``--allow-absent-module`` ^^^^^^^^^^^^^^^^^^^^^^^^^ Indicates whether the code generator is permitted to process namespace for which no module path can be determined. Use this only when generating bindings that will not be referenced by other bindings. This option turns on the feature. .. _pyxbgen--no-allow-absent-module: ``--no-allow-absent-module`` ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Indicates whether the code generator is permitted to process namespace for which no module path can be determined. Use this only when generating bindings that will not be referenced by other bindings. This option turns off the feature (default). .. _pyxbgen--allow-builtin-generation: ``--allow-builtin-generation`` ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Indicates whether bindings will be written for namespaces that are built-in to PyXB. This must be enabled when building bindings for the XML, XMLSchema instance, and other built-in namespaces. Normally generation of these namespaces is inhibited lest it produce inconsistencies. This option turns on the feature. .. _pyxbgen--no-allow-builtin-generation: ``--no-allow-builtin-generation`` ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Indicates whether bindings will be written for namespaces that are built-in to PyXB. This must be enabled when building bindings for the XML, XMLSchema instance, and other built-in namespaces. Normally generation of these namespaces is inhibited lest it produce inconsistencies. This option turns off the feature (default). WSDL Options ------------ Options relevant to generating bindings from WSDL service descriptions .. table:: WSDL Options =================== ============= ====== ================================================== Long Option Argument Alt Description =================== ============= ====== ================================================== ``--wsdl-location`` *FILE_or_URL* ``-W`` :ref:`Generate bindings for the types stanza of the...` =================== ============= ====== ================================================== .. _pyxbgen--wsdl-location: ``--wsdl-location`` ^^^^^^^^^^^^^^^^^^^ Generate bindings for the ``types`` stanza of the WSDL at this location. This option is equivalent to retrieving the WSDL, extracting the schema part of its ``types`` block to a file, and using that file as a ``--schema-location``. PyXB-1.2.6/doc/extapi.py0000644000175000017500000000406513152762205014311 0ustar pabpab00000000000000# -*- coding: utf-8 -*- # Copyright 2009-2017, Peter A. Bigot # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain a # copy of the License at: # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. from __future__ import print_function import os.path from docutils import nodes import sys import re __Reference_re = re.compile('\s*(.*)\s+<(.*)>\s*$', re.MULTILINE + re.DOTALL) def ticket_role(role, rawtext, text, lineno, inliner, options={}, content=[]): """ Role `:ticket:` generates references to SourceForge tickets. """ trac_root = 'https://sourceforge.net/p/pyxb/tickets' # assume module is references #print 'Text "%s"' % (text,) mo = __Reference_re.match(text) label = None if mo is not None: ( label, text ) = mo.group(1, 2) ticket = text.strip() uri = '%s/%s/' % (trac_root, ticket) if label is None: label = 'SF ticket %s' % (ticket,) node = nodes.reference(rawtext, label, refuri=uri, **options) return [node], [] def issue_role(role, rawtext, text, lineno, inliner, options={}, content=[]): """ Role `:issue:` generates references to github issues. """ issue_root = 'https://github.com/pabigot/pyxb/issues' # assume module is references mo = __Reference_re.match(text) label = None if mo is not None: ( label, text ) = mo.group(1, 2) ticket = text.strip() uri = '%s/%s/' % (issue_root, ticket) if label is None: label = 'issue %s' % (ticket,) node = nodes.reference(rawtext, label, refuri=uri, **options) return [node], [] def setup(app): app.add_role('ticket', ticket_role) app.add_role('issue', issue_role) PyXB-1.2.6/doc/examples.txt0000644000175000017500000001260213152762205015020 0ustar pabpab00000000000000.. _examples: ******** Examples ******** A detailed, albeit contrived, example of how to use PyXB is in :ref:`pyxbgen`. Multiple real-world XML and web service examples of varying complexity are provided in the :file:`examples` subdirectories of the PyXB distribution and of the various bundles. Some are WSDL services, and others are simply XMLSchema documents. Often there are a couple trivial programs that show how the bindings are used. The script :file:`test.sh` in each directory can be used to generate the bindings and run the programs in a single step. See the :file:`README.txt` file in each example subdirectory for more information. For ... - REST-style interactions, see :ref:`ex_dictionary`, :ref:`ex_ndfd`, and :ref:`thirty_sec_example` - SOAP interactions, see :ref:`ex_weather`, :ref:`ex_ndfd`, and :ref:`ex_geocoder` - Customizing a generated binding, see :ref:`ex_tmsxtvd` - Using a SAX parser, see :ref:`ex_tmsxtvd` You may also want to look at some of the unit tests for other ideas. .. _ex_dictionary: Dictionary (Aonaware) ===================== The `Dictionary web service at Aonaware `_. The example :file:`define.py` looks up a word in all available dictionaries: .. literalinclude:: ../examples/dictionary/define.py The example :file:`showdict.py` lists the available dictionaries: .. literalinclude:: ../examples/dictionary/showdict.py Sorry, no automatic generation of classes corresponding to the WSDL operations. Next release, maybe. .. _ex_weather: Simple Weather (CDyne) ====================== A `free weather service `_. The REST interface was demonstrated as the :ref:`thirty_sec_example`. A SOAP interface example is in ``client.py``: .. literalinclude:: ../examples/weather/client.py Note the various misspellings in the schema (e.g., "Desciption"). Also, be aware that the weather information in this service does not get updated often, and sometimes fails to provide valid dates. Try various zip codes; usually you can find one that works. .. _ex_ndfd: Professional Weather (National Digital Forecast Data) ===================================================== Interact with the `National Digital Forecast Database `_. Use the :file:`genbindings.sh` script to retrieve the schema for Digital Weather Markup Language and generate the bindings. Note that the schema has two levels of ``include`` directives, which PyXB follows. The examples for this service are too long to include into the web documentation. :file:`forecast.py` uses the REST interface to get the forecast temperature data for two locations, and print it in several ways. :file:`latlon.py` does something similar but for a latitude/longitude pair, using SOAP, and requesting more data. .. _ex_tmsxtvd: Television Schedules (Tribune Media Services) ============================================= A commercial service for `television listings `_. Only one sample document is available for testing; it is retrieved using :file:`genbindings.sh`. The :file:`dumpsample.py` demonstrates extending a binding to add a custom method, and parsing content with both DOM and SAX. It also provides timing information; the document is about 200KB, and takes several seconds to parse. .. literalinclude:: ../examples/tmsxtvd/dumpsample.py .. _ex_geocoder: Address-To-Latitude/Longitude (http://geocoder.us) ===================================================== This service provides the latitude and longitude for free-form US addresses. It also demonstrates several of the pitfalls of using WSDL, which has a very lax concept of schemas, with a system that expects to operate on validatable documents. The following changes were made to make the service easier to work with: - Change the element form default to ``qualified``. This is necessary because there is a non-absent target namespace in the schema, and the documents returned from the service set it as the default namespace. This causes the XML engine to associate that namespace with locally-scoped elements like "number", while the original ``unqualified`` form default caused the schema to record them with no namespace. - Set ``minOccurs`` on all the elements, since some are missing from some responses - Set ``nillable`` on all elements that are observed to use ``xsi:nil="true"`` in response documents - Provide types and elements corresponding to the request and response messages, since PyXB's WSDL support does not currently generate them from the operation messages. :file:`genbindings.sh` applies changes to the WSDL after retrieving it and prior to generating the bindings. A second complication is the need to burrow down through wildcard elements in the binding instance generated from the SOAP response. This is the consequence of an `error in the WSDL specification `_, which was discovered after too many tools had already worked around it. Currently, PyXB also requires that you work around it manually, although a customization of the relevant SOAP encoding class could make it unnecessary. .. literalinclude:: ../examples/geocoder/client.py .. _ex_opengis: OpenGIS (http://www.opengeospatial.org) ======================================= See the directory ``examples/OpenGIS`` in the distribution. PyXB-1.2.6/doc/html/0000755000175000017500000000000013152762244013407 5ustar pabpab00000000000000PyXB-1.2.6/doc/html/arch_component.html0000644000175000017500000003247113152762222017277 0ustar pabpab00000000000000 Component Model — PyXB 1.2.6 documentation

Component Model

PyXB’s component model is the representation of XML schema components as a complex relation of data objects. Each object class corresponds to one of the thirteen XML Schema Components, and names of components and their properties follow those definitions. All classes specific to the component model are found in the pyxb.xmlschema.structures module.

The relationships amongst components is depicted in the following diagram. Composite aggregation generally denotes ownership and shared aggregation reference, but don’t look for consistency.

_images/ComponentModel.jpg

Component Model Mix-ins

A variety of Mix-in classes are used to allow common code to be abstracted or to mark objects as having certain capabilities. These mixins are:

Other Information

Most of the important information about the component model is best obtained from the specification or from the PyXB component model API. Tidbits of other relevant information:

  • An understanding of Namespace Resolution is important.
  • Element and attribute declarations that are incorporated by reference are represented in local scope by a copy of the global declaration. This aids in the infrastructure that binds declarations from model and attribute groups to a specific context. Local declarations are associated only with the complex type in which they appear; types that extend or restrict that type refer to the declaration instance associated with the base type.
  • PyXB strictly enforces the requirement that multiple element declarations within a complex type be compatible with respect to type and other attributes. Since occurrence restrictions are associated with a Particle instance rather than the declaration, the same element can appear in multiple places with different multiplicities. Note, though, that the default code generation module collapses all occurrences of any given element into a single Python field in the binding.
PyXB-1.2.6/doc/html/genindex.html0000644000175000017500000172673213152762225016117 0ustar pabpab00000000000000 Index — PyXB 1.2.6 documentation

Index

_ | A | B | C | D | E | F | G | H | I | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Z

_

A

B

C

D

E

F

G

H

I

K

L

M

N

O

P

Q

R

S

T

U

V

W

X

Z

PyXB-1.2.6/doc/html/_images/0000755000175000017500000000000013152762244015013 5ustar pabpab00000000000000PyXB-1.2.6/doc/html/_images/CTDValidationExceptions.jpg0000644000175000017500000021030013152762205022175 0ustar pabpab00000000000000JFIFC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222*" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?Aloou;ޱwKQ@T(T :U|-A$)6F>ȕAx pN`jq=b"aڢN6'88`K=3SH5#p!54W΄)r8p ֹ=G!_k=z7^][ v/|IUȪvmt jmCI|[4v\m3}[8:xL{WULoWeӭ<1_ugjoz&%=օfo[NifD d*lW oN ݼ2h1 znuMXY~ool4*{Q;$S'oɳ0+c0º]sl?ȴ}s7"AEsl?ȴ}s7"AEsl?ȴ}s7"AEsl?ȴ}s7"AEsl?ȴ}s7"AEsl?ȴ}s7"AEsl?ȴ}s7"AEsl?ȴ}s7"AEsl?ȴ}s7"AEsl?ȴ}s7"AEsl?ȴ}s7"AEsl?ȴ}s7"AEsl?ȵ.OԺ$sӮc$or" `v_*1|kC)f/ᡚ(|umzmOZuM>I+źt`24Ԥ4cO7$1Msno{ݬm3Tp~l#qT756VH⹶Ef֑;J 4*;20Ƈ&1MrQQR [@ %+%rpK %L[!\lS*3v'uo(ib &wRM?S4IG+e2nv^\gp_XiJtil& nwgԐʑHOۇNu.ծ>Xy?M5$jTW/o'!@A38޹JTkK$&4{C.vԩ R֩u}@#D`vI$j6=b7YcYXuWurO*nfQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE|A(~%j(?VFsa]KKfº]QEQEQEQEQEQEQEQEQEQEQEQEQE%WU9dqY-^`~uPWM/]ԭ5mCRZls$&#l# ַq{΍v%hWSF vQ/R8r9EfկZw=.Ⱦ#kىq:qŵoɲA_Vޚk٬hY-|" *c z6 >WOSRxwlCof"P6Uz 3 uh70%=61ZI2,I‚+ߜJNםC|Aզciby"vXY-'^}ӓ 5ۍCJ̳A\f{#$2I ]j ikyzJr-7¥ɷaXP׭"K\8>XS&\kʴiEs%`2H2L"~@>b6G$75-%kO-/EɂF`t с °b:#E9Ao_IOF4^cnj56bs2+Ea QI댜 Z7Ez&?$KqV<-B֏156z};HC%F~9T2nd)lz!V*!V+((((((((((((((((PKa[Q(~%j(º]s u/- (((((((((((((+J`w]5s1Ccng㹵EV&EPEPEPii4N4R 00L4L407In+5?9a&[p:'b:'b((((((((((((((((o+lW?WR٫((((((((((((+F7eqg ;eRZ2vvvu%WU^.dֵo.+ҲO!oԞ@WEj=F{,efK#GrX%p%;j(,((( 001iƚj@ayCii|sxt݋[+Pfm4>qA#>k5?9a&[pH 9슶8Ho N$Eo3yS@$Т(((((((((((((((C/nkQG·_5 ; _[5t7@w?Կj(c|/9Ƴu 7[ѽR4l@yձOP(5OН/H}GsE+ٝOН/H}GsEAfttW9 >Bvl"Ie]\$ ?'?N?$QtgGEsj'k(sE˸Y%W}B~l"5es.ftW1 m OK?P?$R](_ ugsuf)"kVTi$XԐ̻EU{=2ծO,QSt "Y?}x>P}4hl8C>y5Zڈ=m#Edzj޷-Pa#B@0~=_B=&˶wGLÏ#UmOV wX5kY9ɖ䌆Gc,x$Q@:&\y77V#]]jnXoGn (_`MW?|[C&~wtQd;o 4`MW.ſ2j5_ck 8Oɪ߻3LFTTHR̖8rIwxͅէZc.+~i%Hg0|P =J0õn?5_ekN':uꀶgOdSIY{ş2j;_{E>UWg犿c/3G#~*U,wQʻ3_1_נQK=EOC|Yg!Էx-%2fUQ'djz;wD*d6YA2ƪGmK.y@Y$ 8'N>u?Z#X,q?d\2Vco:Vn-uU8YW>J%uwܣEtTP{BS[ .n u?}]"ŻZ޷[9 !d{UoKkmb,Wȟ(>Q\لzͽ֍!8>)1IY#utae9z@(mtTkˏ LۿQQ;\_J,ttW9 >Bvl"Ie]s}GsE?'k( 3IeOН/H,Ύ?'N?$Q >Bvl"::+P;\_G%7'(AftW5 U OJO?$Q̻Q\%(k)?.C\G2gOErУ?HsYE.hVu4W=xjZishږ<\FFȬ#Ezj(o+lW?WR٫o "ºM]MyޥqR^i/D$$ARHI䎝ED*#ԤҮ,uY< x$/;dq|ʃ+X|@VoV0E x+%GF$G-ڷ_RmlzEf>lڞ2B[{WybHfP#dlR;n{o:>h[gE8YZI&@Y i$ݼݯ~Q^C?ïXEeY.dv9.xZۊ܋Loډߏ6=) KW mCOn-y2$;sDPvripZ\@GD2vlr~N2(Qo=v=HMyz=vPH5XdIQF̙'o^Nӎ0jVvi.`k&FfW Yd}ǢI>f2zyf^rM4Zպ!J@`erw'NXY\^uRkwgiHUps]/q޿ޚa%ɪjvZIɛ L^ڽ^^M0Z[X[IKyW$wݷޚ|c !cQVD.-J|rh"[<犂\mc}MVrs}8(TymM/Jӭ2^bveEOMIrG%Xc%0,\ycՏ01l|-]-./Kd_sڢ((((((+-VjvenakuŧsfeL]Az4htuXťIZ]I$qw7@w?Կj)%`QE(((((((FUu*#E`I:9m)4y䶞ZccT(wN MnVuF>SZI-.%Os}w$VCuim}l\@ [0O! U<=exX50"fNUap9'&c&*i&B/2ǎ/_Xom*iԗ)i$҄he\x9QG#Z29?9iіu:|W axТy p=~ս?{QVI·_5PKa[P u/-  ; _[5tW-/]WQɫ?|;Y]]̚iwl^LXD*;?V?_G [D|_MdYEsH C H#/OѠV [D|_MKm4Hk  Э/&_+h/ M5?m ?K;*RI^7Cz~ϰÝ3)h=MQ> /EO)BƋ4i+B΍4 г_M-l|c !cQTkF7t ?KDmP,6n 2@#ZkB((((((((WA\sa]KKf ( ( ( ( ( ( ( ( ( (9_Ÿ#z񥍦yKX.[|3w$eOG [D|_Me=ˎ?V?_L> j̰ h"WRʆ @d~bB:+ Э/& 46a pGݣ@: + Э/&A%Bޠ [D|_M' [D|_Miɧھf(qa㒫۵Lk_+/xO}4 ّC)`1Ҳkp2U0f$;%=jt ohQ` 'rI hwÚ4 Im8ztQ (C/nkQG·_5 ; _[5t7@w?Կj(KQ<q$ڦ,r7?0kKWZh3G 1ꚓ<0UQɹ$**l\/} sg @'j/y>ե* "x2vSϡQu?\7}3VV*s=~}*' Ťՙ8&;VVI[^x0@ p g#qlAs14@}{]"U(>x|So$4#a%Vp QJ h4iqVC0xۘ<I[<r+thLxf ʹIr}j-bLI,eYS;[ɵc- 俖vٻsWcP~U,y8۞sIK&N$jc[*w`r krMo [%܅R4ۺY%F<*Ԛ+)Y7.F9q״ eigVeCo *&͎xR۹Q(w.^\IKIg̲9Jɸk{9HHM9?1+ rk:ŷؼ7vatٳRXo΍Jv1 reo!U5VS!}Rk?ea 4@+ќa68縈z܏_-ȳ0˘ݷ۷v;g>~&ҧIiFZʬ䃍d\-4LM1C 0>XAk 5@1BJ;a *HikBOЍhWaQEQEQEQEQEQEQEQEs u/-  ; _[5tQEQEQEQEQEQEQEQEQEQExB7Q/5+ukxbZXq2yӦ ;_Hi#4F B+o2)qNy=McStmK^TjVk\O,f2cgXǰ>n}krouk F;K*#bW9 c</QPԺnJW:Nl^u [!%عe}:i K/ڄL..d-!(q:,NOU .yy^OcwqkF HA2z\{jJ`D_yk1t!{}luxm`ۏ u4?4AgB>{vpyYY hd*Ѱ%Cm9&c{ySVff+`Hi44 ѿZV4Ugk Vϸ ?#5jr\@,Zxf<ƻywddQFmйխma;I*"GgERPI YI)0#9=8ަqNF[Wךk?9iіuOF($PKa[Q(~%j(º]s u/- +.+d-/]WQɪ'Qط +0I$9=}HF8CKs"O[<1\\$PR]UTy9 TZ)`(5;].'C~Gи[R-Us6-yuxY*ml13 VΠ,p9\duքnVqKῌK<_mV< !6ۻkcE]w??UikBOЍhWaQEQEQEQEQEQEQEQEs u/-  ; _[5tQEQEQEQEQEQEQEQEQEQExBiIoE3d'ҳ|O! U曨kQd|{SOP#lc<8nkM7Y#]ەHpTnWۜOB#ҬmcU-ˁ'n7##ifFޢ}d?ҭ:Ldgo* 8 _8^H}7Fül8$O&ץZϒf2&B+oSL2Lli\9#V_zZ7Rw$R4PD;n!YP8}2pZE#*Wk ` u]Awjm\ۤ7M@wr~]͆_Cj7)8;lq 5R86 Z;9C咻YT:zLT@+͆X`zu$JCga(l?gH7Z,9$;BS $\ӀW>E'eoȾYɵ{Ú4+VP»>ćc[F+_o{JAgp$Xz*OMe[ d$8(BdHҺKTzHrYCq:Қliig/>F[Wךk?9iіuOF($PKa[Q(~%j(º]s u/- +.+dĞIKҮ)N$lVIP|@8'LkBvW G?OGJY2Q\o%$i?J"!i?ć`ZW z\duk:?OG:4)w??UDui_5ꎧ.[Ei6[.yPF !˜W$QֈӒi'F+?D</օtQ@Q@Q@Q@Q@Q@Q@Q@sa]KKfº]QEQEQEQEQEQEQEQEQEQEs'?*GsZ];R}"KY/MEu;B beG Pzv5QOi_69ŷqiQOi_6ğҿm'#1#J&!i? /?OG!#4\I>$?ҿm'#s#4\HOG{ć`zW dz^CGNixJM:׉4"k?9iіu`jVֳo3;HϯZJ ٙI݅QVI·_5PKa[P u/-  ; _[5tQEQEQEQEQEQEQEQEQEQEQEQEQEQE>kj6v|$[qGOQY?0U%E];;s/ס*NC^Ԣ) ߃kcG'~C?UjQGS/ס*NC^Ԣh?xVGIKDSpw3) ksס*FhAQ51ס*FԽ?; z a51 FԽ{051M7Vuv K4,$g{5KŞ W/2r~UB3 +QZQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE|A(~%j(?VFsa]KKfº]QEQEQEQEQEQEQEQEQEQEQEQEQEQEsz w6ҳ}gZPjixY6edI\0KJ`iHSRxo7ifi +#E',Ͽ|*z mw# xkZg47g" |\mNjJP}7PkT-lceWK~R]8*͟4:kR²*һ3,IbJVWJSA+s (((((((((((((((((C/nkQG·_5 ; _[5t7@w?Կj(((((((((((((((8Ԯmm&bo+lW?WR٫((((((((((((((oR.FVc_P4_Jجgv (aEPEPMFjCQLcj61jmR23\ށ{kc zkm @?k5xb[γrٷ!UY}eb><֔"jlwmE>.RI OXvm!*;wWz!X|?kruXeD4[ ?V^Z`>>$h[or_&-n/2aJV  QEQEs;y_]覭J*E5V5O[ieӮ.`woq9gSr|+ it}5R"y0O1֦>o~KtYͻ"H:.-);\hVOZG4NHb"dbd!qv\SZtV׷Y鶩+} 2kwpP8&Q\PG3w+m$k5̥2P׊75].MQK h1!€ZA篖Yº΢'d9ʘ"8`]NzoUQT.~"_jGq}y^e_pF>\~GQ\#JLn-Qdʈ;]q گAҭYdbIXTs',>R!zS YL57t=tKl C"']>;1q&+Hm H+GOn#!J.Mqhmoܓ4rK/8+:"OLfohrI<+iqieql--?-yU96`Cu8d2M5bfhՙfzc$mbH%Y;M5ȷ})V|mU'q#5E&q%nC"(9n89[Au}~i|TIagsmw}wv˾ hƌ3G<7\^=NGJniwvR]GS6]7T#ހ _]m)GDG&Zl\_[v?aJ@gH R0C}$xdSRZVM:Cv~$G43MYm7Ms,bYIUY3m#IC{4d:mqG^۬߫?1M:Cn~+%mNIHKf`AabNv8VZ$6Mh&%D>Q(XSăqе5g)Bl?՟힗eIrp,&Ē'ʠ``qP|,7M}Bk?է ?MkZ]HwQElf|A(~%j(?VFsa]KKfº]?<+kq-ljthgI+#-A\ua]GK&ҹgס*NC^Ԣew?Q ߃kcZQ51ס*() ߃kcG'~C?UjSM9 NC^?; z a^9 ?0Tw?UL4; z a514GgM<+uqtiGw3; I^{hXdC]F"*bV휜cp22r+/SH^ q&cPXR@+ƛG@z\/:j`;ۭaW {y+#ހ7֙şWSU>!"4><jmKs\\ }ַ+xR#HADPҟ@>lkw{!Q6ve((OwkxHg{Dby-%(a\~O)<5_^ow8_1B;5_^iΉWj_M;}?4i4ώ4_'U@Yb'"M(HM;} XŻ=͌w1ؤ醇?5.ZMtj'T= {5W8#5dtn5biÝ3v-[r˼Bts4N.Q$Wq}#< 2XaӵhxzkA 93[Ȟgn~s o\s-C {wF#2AU=5J&J-gq^nunH=m4`_K!Oi.FɧXmsՏ$+R(((+U.mCq+$=}u# [%:! ffve@!`F\^ x[QKyHF&y+pbá4{moI$c$O!{ V&UTP )h[6"iP\I<α< I pkv'<3qZg'؞,խ6Hs]w69ERrkvڮ]q&P:!P)kcHB""UP0Fn袊s+-7QH%v y$bE]=Eqm&#"A)"RA8>P@C#w*t,!IPqw-P!r E.Ř1Jnpiͅ=6̰ߦ1ce~(j[߂ Kqat+s$c|þH-`hUe`zGQR7s2j^Lv d?C[%kV25x慶\[Le#Hh(((*E5;[ѢY"hf>}0=7Oț>EzSQE·_5PKa[P u/-  ; _[5tWGjqb#( ^Izr^i@khaj[I )?lHDEA]S[6_G#zϪi{xa{XG5zɻ+8S[6_G#z˱5i4 mI9$w3_#.m(P0 dLr@+elB;-|G?5e?ߛ/G-+:pXDi$[TU˟_Z]jMWRo*0m$spciC~l|?ߛ/G X֞xWo$_Vx|!k4|8? /QM;[K}*U`oc譒`qKjʙt-GgYaе5g*x7{'H㙾ʈeCw OjT$f%ȉDB8LaVIg'RưniW\K JP3GlҢ[ҽ#D</]QZ[!\] Oֻ@#]49j+JƅQZQ@Q@W5{ײ:"bښsEz'z.f-R:/E݃jZUbhU2]ݘ;嘞:IrIxapoh8ON"0ea@ EPEP?'%UjԬA5ׁ|CooO.rgcOƋ=]uVo Q::+CMyƨCMyƪ,˺:Z+CMyƨCMyƨ O4?MWןjO4?MWןj0:Z+CMyƨCMyƨ O4?MWןjO4?MWןj0:CҘk>;5_^i։RattFk>9?SO4_'T_aύ_'Tm M5|ksU=>4R}4XGzG5_i<_\Fυ&uLIz ._e h9cGGRX& "ȨӱE·_5PKa[P u/-  ; _[5tW-/]WQɫKP%΁{@j@h?&APߎH@r8Y.dm\bO$IQc`iaieVWGXq n|ۏ-Sr;U.%Q\E~f8nk?]𽞿,2\_[yzX܏&vP1D%cev$1qRJ4-s a}9628!'uJ^~n eP|u*#^}y?mFmq8McGN w:L5x[zDZ@Bʰ{޺3GB'Y;,*4OЍq~1 Ҩ? B5G9nhQEEPE 'u5ʼFI ]FJDG">-xq{s⛉,4 *6)wpґ4EWӬⳳ B {xm-㷷"% hUTp((((z3PM>K+C|0k{Z׈u#{ #K@ Q@Q@Q@Q@u* gLr !]OfRJV{yذaX+"8zr:CiqkqtؚK5)< 9de#@御e夫-$EFA(  x e \h14;ߧ)izf.qGR l:XwXz^WI:P sŽ2<2=A~iVw=CnЀx ( >es3K,;{z(?N}ƏM;}Т34hӿo (?N}ƏM;}Т34hӿo (?N}ƏM;}Т34hӿo (?N}ƏM;}Т34hӿo (?N}ƏM;}Т34hӿo (?N}ƬZ<{7wNqՊ((C/nkQG·_5 ; _[5t7@w?Կj([_WS\ua]GK&Gsv( ( ( iSMii < !aacE] x?_/??Uv'F(&U74(Ԁ"EI#"pI4ˋm-!%/$0UUI'j;yc"_E$R IޑpV'j;=9W~RƱƪUS`p(((((.#fH]Y i:L=$_sQՋ^Ivq3  U T-Q@Q@Q@Q@Q@ſS؏F+5orrZ?e~Y;mOatbpJ2rOfbPsp際/ 9d?re0aڀ6袊(*YV0h|3F$20Or8P5yΖ^#ux[ʻcrx 0FuLZdq؎EY((((((((((((o+lW?WR٫ +Vz ݞm7i7Nu+VXʰ*r ]WߘgƝ[U5U5N}ƏM;}D>fsh~ ?h~ ?t?ؚw4biȃ'k5G'k5]&>ؚw4r g= R~ ?t_ؚw4biȃΉWj|qwU=N}ƏM;}^;9S} 4G{5]g&>ؚw4{$>vrƚ?5_a<_쿱4hӿoўo ~VᳳSy}25 Ry=4OЍؚw5r#bvϽ\bn^Mt$pSu-JIa'O9$$ IJnu}r Q65"IqK:'lj61j ,B9={S`/OEQEQEQEQEQEk~,UϨ8D?)WC\]nZC{6 ck(((((|EarF_RKڡ?~p 0(mi_Y$2}Gj\c;~MǥvY?G~z((()dt #L_AϨ`1V}v Uh ,<vԴ!nd1;䎢 hmh%PVu-sw:-ޏs&HtmOVC,>uOH֭5dkr lvu׷G hEQEQEQEQEQEQEQEQEQE·_5PKa[P u/-  ; _[5tQEaO Koq]rG%J dxnQ\'~C?U?0TQ\'~C?U?0TQ\'~C?U?0TQ\'~C?U?0TQ\'~C?U?0TQ\'~C?U?0TVfãOs{p-lǙ;@:<ְkMԭw{'65W5 GO'&7t}hVK^U۔ϗl. znFO\'~C?Uji۵ƗZ_@QeP#8 P( ( ( ( ( ( Myis$!liky> nzoL,((((((((boc|'8Zӳrm!Z]-97PkT-lceWK~RՏ @T&oCh2 ( ( ( ( ( -6~רȈ؄=FZڭzV{Lg7>?hZ((((((((Cy qUljp#扏\p}٢)iΙ eY ٟXSqr(_- {m\ R9D4\>o2 Ͳ*"i|9Te|x;qb⤐XhW cf6]s cyQ2?98Q3Bn֡t=4 r2e)j+eow Umۉ$tu|MХ.&YbH1ofrBG);L57ĝ%|$[)d6n,MeQkI%Ij[eȊ'[\o sP%|&cfy7n*{k>oy{l;λs)f1w~ZW^OΤ/WS\x'HWܱi֪`ycRҼIovvM lDő\}S,7M}i&s9;(3> ?VFxJ+uZWA\sa]KKf }*Zn6~IZ6 ҲAZVwCMR6u Av2axY=}8Gsi|)iwuI^_Op$vzPx| 9I8bLF؟|`6NOnSp͗#C~l[º-ѹьu.Hȩ6|t#4Ӡj_7@Կoֿ՟#WI[DXHE`ɴ38*׃tf~1̠CpxRRZVL:Cn~/ЃzJ丽 P+#R?*I=Ilq{2NDdPXrm\J: ӡj?6k?T>C9i[ZVFݏbKTOjv ? qеi*Ś2v 0@ bӀ:VܙzEQ[Q@Q@Q@Q@Q@[飮{\4C\gtnem=;b(5i*h(((((((((+ho-eed1R0A/ͧZI̳MŶp = ޿+tU &]J)bϳ 7 2s ע]Z-kL4h%&2)ã{85@Q@Q@s;y_]覮>4G?5e?ߛ/GU| _Vv}i9&ӄ7Yy3^M(o96c*?COy?g}lfݻg~N:QC~lG?5e zzMY xsK %2d|s#p –s)8kS[6_Ep,4'i2=X/w_qg}텽}o:Kq,F3R8k@o͗#`+]E/ⴓ "7\˽PFb#4 ̯>{4.,`F:ӎ߭߫?GRZVI1I'b b[M\# f$r1RoSL{iRb\`׾jS_7k_AԿm՟16x q,G$I%Գ0G ˱';Gb{K&uoq"(XSăqе5g)Bl՟rKӤ{8rIvBP008>ț>Esj?5U&u.L(PKa[Q(~%j(º]s u/- +N[G SRؒHQIdXGk[_TTبnYgn40ͽ,Hz#= $rG*Sŭ,k'w{XluZM>&[uhIi×ǫ'Ao˫68 2yH$SP:lp%~A5 YxY]0xV,%ѷqZWu-R;}=nL1>I%<>$$4NuuhhU`H1}XN.בxoŷƴw0 y!YarL>;Qv*4 Fw9?Qfm,D朮7Qkz< L-$jp/,q/7̆Y('1cOͻ x5R[x%̞TYlN}ֿ&ZvCv4ißp~Y> v(Tߺ1[$ƺ.aY /G#FS9 Tqk{'H♾ʈeCNA/^3Q!t$IK\qÌ(N>ڻQUbJ:m_vn*!\~I'Y]8+tv ? ڗsT( B(((()3Uz@'_Cu $6U7q<|)iu"%{39·((((((((((NmX5#o ?]=2XTY#J0`x Jd7ṉMLP@>TtQEQEIu w$Ŀ M@>o;M8HPn*N1|f  7mZ3uۗI2"TzFEaO ^ dM\CcR GZօ¢W8/K}E,A&WFpqxS&5 &;fDS$%O)P%!wqhf[qnf̱`G%y$aNXsO kkS3[9MKwq#ݹE4"S*̽_S}2).|^<Xɷ8 wZR+^\;NØ E"Ոd<` 5K[hm5VQ(F $)!=u5uՎS֍2<BF]V >`8U=:Wm 4v1fU9$RQBI+"'U9t+ #o-TM"=ddvX:o"g[ج>$ N!Mݏq5R,ry05 %1)UEu1R::GeBX?;[6PWhAi cڋLԥ/> d|ώcم\clO~ѻ{;1g8+4Sʒ7'+orOEʑr:*KzHj3A3X^]8+tv ? ҏeSch1 ( ( ( ( 񜮞+5ڭDu3|\Ñ/d?$€7 8bPơUG`EQEQEQEQEQEQEQEQEQEQE X_8rqU aX֭s60۱C*}}A= iW3) $ EXXv|zFBt2T:Z( w$Ŀ M]s;y_]覠 J(B((( < iic 00y@0gt5D7.Ԋ(̏o+lW?WR٫o "ºM]MpWk=JUo;nYZWR`U֢kB\'k5G'k5YٗttW5 Q QfGKEs_h~ ?h~ ?attO4?MWןjCMyƨ 4\։SOtO'T_`70Wj|msU=}7FkG{5M>3?R`7 ax[GmwHট?UEx2qwV"xYZĤp7+JI3iѨ((((+L?TLC] sH]GPp}Q[ʌ1Ƈ((((((((((((eWB# FmS>YLTz>xB?MtՙXӌ+)'Z [v#$w :+/Aί`TA 5@s;y_]覮i^ RM ?VFxJ+uZWA\sa]KKf ucoyٝ1V( M;}?4kBӿoN}ƴ( M;}?4kBӿoN}ƴ( M;}?4kBӿoN}ƴ( M;}?4kBӿo ҬYbkCoZEQEQEQEQEQEfxQm'z2[H)?Ժ.FaȴP3VgWH?nԡ ?؋3}*h(((((((((((((ף}P_Z4h-N2@:Hv$atqȓDVS ӈ\ƒ'u4=_r?:z()ϥY\nq޵&>hQ@ؚw4biօϿ>G&>hQ@ؚw4biօϿ>G&>hQ@ؚw4biօϿ>G&>hQ@ؚw4biօϿ>V-lm='8jQE·_5PKa[P u/-  ; _[5tQEQEQEQEQEQEQEQEQEQEQEQEQEQEK>i+pd{ßZ53Ȗ!P7󮆀 ( ( ( ( ( ( ( ( ( ( ( ( ( ִ1F@DNzT]}ZPGi5;9"aȼz,grS}Az ((((((((((PKa[Q(~%j(º]s u/- (((((((((((((*˨l(#i\*SW=CnM<}Jhq겸W(oZi-5'o+lW?WR٫((((((7>7psM[ gQkpT=txB'?i?onXݚY_i?onEY_i?o?V5Km6-.x$ laPCdW^v}oIko.Kmmq2$'$#(z_ւ?oilk6]b(Eچttp@z >ź=γ{}8%,1 s7\v4]OD?{{hKNsv[xn4)5uX4Ĵkq!! 2+au)řmfD1sc7̷K-;5?ӿ\Wnd85.Y%qkl]EI6/k2K]'0WGȥ?oC/4&mfF_[%df^ 4xnn,[jʲCp01.u2gjrB{qecbS $vv;!?svV5ڱ 6lVkig('\~Y`2F sJ}شk{Vvu‘vl^u^o#_0spbd||]:֣*[YAy|ǽ+,sv|5g?/?_VӧeӢ-dwIl)@~b\;#n^i<㵲i4öԾ Vִ("{'hAr͍ŏ_5k;kGiI"i$z Q[Q@Q@Q@Q@p.myyy}ͩ'*]J@ `-/]WQɪ&*;"Zwk=%;[Vwe_i?oxBkfQQ4Ё{:DX'eϸZ i9E) c: ;8Ԯȩ?o'"k=mEk:z6yM!қ?t[{WK ZO0m]sv??yyi^2Z[Irmc0̎rTpA`;Z_SMFM.Mx|{y%)aǨynDY;M>svđ5Ku mlcMohoNG)g7qe񝡳+vDGvO-\dt\;#֬kkkjclԊ1)VIֽqlٿ?.s?p~1 Ҩ? B5&jТ+Bo+lW?WR٫((((((_Ÿ#_=wk j91!CX+i=7'%j>h8 V[@M5ko4OKX ~'$:K$>F}3L0ٌUýF4ҽ+ &7e ur ~h8_ _FVA;=([4mZv@.45D7.pT0KԒgNd;b~h8_ _FswV.t6k77rO4#>8s/M&_Lb L#'[@M5ko4OK6`cH2v>o;{#tbR:aٝgg,pf1}9^~-&'%j|Dʿ՚/@שr5*-NrA$ކ.6wpGpX*>Pn[@M5!o4OKԵFeڇXԡnĢO*7 B~l$p+!?b5+[hA; _)*0uſ?o/#SMߋ? _FvV>-#zX^Z932/%vб'U>Kq4BXZ;gBC0L޺#w7k_t_]^ǧb͵K[[e~ Fӟ\mI+MR(M}2Y%HnU6ܰkd/ ji_toKԮr?ɨdC.đN~oֶ bFM7^*6ijchMbFHnS@m=Msdv ? Su5꿂Y50pu8e2DbO?iI{Oc(2 ( ( ( ( % ?Y5u5vwas WP$9L9Q*'Q('%j>h8+dIdKmD>PߵHwcx<5ZYHWYY |8۸rkC~-&'%j}-w sf=j`5twʓvh98x(uK53~smdn1޵>h8_ _Fw;b-էeݩ7:΂o%Rs*j]iL!1jI?{z{V[@M5ko4OK6kGCxT_/D.VO28VDQPq@9$5X|3M跟fƩ~޿]?'%j>h8.MWȻ7 G*"~aeܨÐCg#Gh!HeQ rbq8j_ _F~-&? 9S*3ך*Qq'$17[)D#ݍ3+K~,&y/ jm݂}uDIm쭑*Z_09P!ceBn(LF`(ms)*O;zrxw,OϷfzwJG)R1.ogaS^X^,6v5H'!@[o_AXC{jC#Ԃ]+no/ZB$(d(h2HI'ܚjI-Jz彌;IJ>\yId|fom:Y+DX)‡ܼ+j]2y-63D#sx%𾒮L۷|u+*;U-ptj8VW%廧qżL2HHdKjgm:yR9$V3Fb8 ZڨUe]]dS1FGM hݳt1ujq3AI#F=}H)vlm.dPz,E/_x @G u?^kb&x iFVIǖkAQoM,7P>@9=猬c%Ŭ#6v'g+DxwKNDWVFB)l&O]Tz5v%Ww!Hp]20#ObU%720=ENiB$(d*h2Hߋ1$Ib}iiM4Ӎ4L4L4iqC9?XTUhc !cQWikeSsB(Lψo+lW?WR٫((((((_Ÿ#_Ÿ#noIYIcykQُ=Hspyj)."hvē`Ti\|ctטQ0Wa"C9)uWѻ܏-ؐsv?lsYM7WK(-K*8$O8iZeP@-,ʃ88T}MT^#ki a*$͜H&cS:5neYe]JwEu(mb7$\?2sq+ro0,HcD;~~Qߞ¤\"UH. ,†Ծw{~kK_@;G;%_Ra )tb-2!6%[x8䙳ccTfO V T]Mlvè|tFlUJdA#i>:\g_FAhbA+Ǟ5 ?ܷqyS&؆kzqެ번kin|ne> !Hu&iXU>{n]zxoÈr+Fo%W:o;kGnZƼJǠEsQ@Q@Q@Q@r^Y@[i#cj[H˨?l uxKA_j gAUj6*cqKL+JF)bdjeWPmђ@8#)m$ 31u$= [nWhg]׉$ YLHy(~r9k^k1a`cM\u$VӬQPE۹P ۜ8i%ډV(nH̨Jc4n}oX1\)yD 9I{;]-[f IK1$f!B c9YWSqi_u H| ILQjE-t8H."ZݠQlJ 3f%d\`d~M^:rG&HAW7(3{H֏nd%T0KchϾF=r*3A,am.Sj7x=hAM!e-wڌKM9^QR\ f[o~&6Nю55owkph17oHCr{ Ҽխ4 2bEQ~RA'Ѹ+猚՞`"Xฒ)5rXZ> pUɨZ뗚K%!6kdAUs9Kg> #BW=2{NܞjqiQ~/?w9)T3%ޥyq lB$ث.8'PE /w*Ww 0 4 ChQ'Ŏokgi-R*N8]:Z6_-G[d.\gCN!#?mZyv&F yBX錦;gvƚhdiRK`TlG7+NzֵfTDX ȁvu M4r.Ssմ*Ų cjR0 ^WvkGR'0-CDLr;A$O1Кi[l >^Uy/nٝSO[YZOoo4\D%TbE6;` vFiX[J9։K|)D`E yMo>)E-h03a.ݑk4Jߕ-;^²2JOЍq~1 Ҩ? B5KchQE·_5PKa[P u/-  ; _[5tQEQEQEQEQEQEW9 S¯w59 S¯w4[摨0_r$xQ㌒3QkRbXIv!FO:ds#ysY]ڦ5i}ϔƮ`v#ٕ3}{^nqkEaL-Z&ݮJwx-KҮisJQB.;Kݷ ]]xNI f| /Qq .s #*q],CVBeH+/F% 1Er "|~lO>OW;C5$R0v#+ G5MC;TQė~Ew~_ڢeDhr0UgyD6PhMKȲ+!1#@:Sm|C^ͧ(Ӿ]gD N3}xgC Q媳n '㿷ZA9Tob֏kwv2K|.0"4p曨hj7I4@(+VWR:d*esea|YPN6NNѼK>sodgQaU1 g+=8U}-)umi xZ8软!! =ׅ㺲36\R9^}^;3=1>G1TjJ@pvHMOu%UNsGA8ߡk9%}w .{g dbp>lȏk xD־`iHeٻ^mݞUo^CbgTI$PKo<ۄl{jSiԛMSuԴ[i2UyV#ܨUAM;1iƚiiyCiiƚ[-#apV~"*lz Q]!EPEPEPEP\/mahd5%xPpA[\ua]GK&Pve'E;So3o.5R=qWC)V CG&ʿ']:;k}P65L p 5I%Xok o$0H :ME+zF7QU3yhďLn=0GB'($DΤ3} uHoYQ# I79|5Oq #h ߼x\,qi٫omEѧ Dli/to̒pxdd }ޯES^VFy|-0M {ȼ/mi͏'s)([7{CG\)b&rUGoL [Ɯi2M4Ӎ4$iq4M8M!4O4Hii3cE] x?_/??Uv'F(&U74(PKa[Q(~%j(º]s u/- ((((((+?)aW;ꞥͺ} ;VU 23F}'¬GG* /Jtu̾clnHV,u8M--bv͐Ig8K  ҿ]<7@+t2ZtyXZ]#*94="[{{y4 + g:?VxozW هy<.tf) (O›m{㼼t1yq^l11XS|2/4~H RI+}k=֙PiFͪϦF"%l/qUek#`t{X;}*IDʱۢ ~zHBȊ0 22A?/ oӬLfYbgk¬GOىoVt3z}Sqck4w da# `#09>kXvWjT ¬GG* /Jtt{0:U嵷fY`d ^~Vog:?VxozW ىNV/E谵a6 ߷gS@Kgo$-xAHAX_<7@+ Z}ZޝkrL1_a1Ce=^OV@1Q*S\* /Jtt¬GG 4* /Jtt¬GKy9iVxozW g:={C\Me¬GG* /Jtt{0F? @gg:<#eL- \ƬcQ@?* /Jtt¬G]¬GG* /JtuQ@?* /Jtt¬G]¬GG* /JtuQ@?* /Jtt¬G]¬GG* /JtuVG)t\[o-Tg4 eg&dO.m! 88}]* /JtuoP  Ly9,ٺ!/>tZfZj6ĘnaYS=@az* /Jtt¬G]B8U^Y_.(Y_.U^븢8U^Y_.(Y_.U^븢8~hG4:~tt2GB+v͌g$V((o+lW?WR٫(((((((((('&84>FsM\ͥY" 8 1Yv~#l4wzӡR&dO*v!RwzWG?:5=.eϪBz#gLȲj>Q*q9 &4h5㴋GdRybDv{%Źv,8R{0 tQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE:P_$"MHY\ +t'hQ@5,d`ךٵO4ۼ] s~^/LѴ,chyC,rI<]=gV6 (((((((PKa[Q(~%j(º]s u/- (((((((((+jOWe·))[W5Z{AW۫ J>}IUV}& M^Id9ycv=؜v8(R4P0JuPEPEPEPEP7ģW ŕqv}IPAe=bKyhF~F<-w;XMd,ePO'õnEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQECan렮~J`w]QEQEQEQEQEQEQE|A(~%j(?VFsa]KKfº]QEQEQEQEQEQEQEQEKVmm6[۝S QGvb@շu݂15#xS_R424XcvF V 褟恥\@g5Mʹ`AaC&,{mEQEQEQEQEQE_'umu!uoV=6qctem0h{닍6K+ߨK=d*Y?hUշ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@=gV6 ? ѷuPEPEPEPEPEPEPEP;_ ֢C/nkQ@_7@w?Կj+o+lPEPEPEPEPEPEPEPEw+,:6jH!LۢG`pSQ':,Dd0Ґtp}:NPizechC,Ĝc݉$ܓW((((((((տK[-exa} 'ȐA]%UԴ}[L.#h:؎5C:``u 7Hu*مlEQEQEQEQEQEQEQEQEQEQEQEQEQEQECan렮~J`w]QEQEQEQEQEQEQE|A(~%j(?VFsa]KKfº]h,:6|.Pu*( *;Ww\Fxn$dmn#jGajߡQ/%;G"Zwk=v {GV%g(N@{xA:iԆ?nԞV3""Zwk=%;Vf.m*E>$%)e# O H4dm#;YwU 1 g? *;nRmag*(֯8\8ւasisza [a1}&f&h^EU;O~⥹!/?y{i6իh ,"unq*<9gbgX$(ppNO`Oj/+-8>o84ִ..SiԵk:rXM*IZlؼ,DeʳHA$r1E{-;5?\"BO 6ܴDF Y(إti#I~[0 6pH "?o7K?{{jxD 4q"ܡXA zhVϭA:oWEY eI8#$ QEE_El?\ X;PM_ֆ[F mKmGr70YR3*&7:I3;DL>p@}TG WhD|/c?/4bu^ڵ?4k{VK ZO0m]svźjnlif)US|^*cLүW6i^LvHn^i<|S茢M{KCT#}*Sm_ڶ>eO&aQԸ=.iw #&?GUK|K"}vY*`Ϸ\mށ#5/a}I ѱkp+Ѭ?m\ {je;_BQVHQEQEQEh,:6|.Pu*( *;V"Zwk=GHՠ?, #$岈't2>դ(ԛQ'#@tgN }<18϶i]W-;5?ӿ\kLWjI5 m\ iPg-jC[vִ5f3t q=( ""Zwk=%;VZTIKnd&Tp?0t<)=k[Y7ՏE-E슃zJ=ͬAneRJ|ܐ 1N>k=.Es{ K9ɷT2ʮ*7.[$6'Co/h< ,J`g\62n*##%Y|+a?o0Zu^ڶ#yttcrpx$Tό<>څzyC$s+Fʇ wgzWc^u^i͗k<dB midv(<`2@l?d<짒)WI`%I9 zWdZ>sv|7i?/?H|Cmmkf3!-?n O0<mRwmoM n&cw"cs} +˸숏m\ԥKWcowz4Q.U,p$lmy VftCwȄd2rF9S߾+"v{EVaEPEP;_ ֢C/nkQ@_7@w?Կj+o+lP\y<'nw>훿2>1n35W~Q-l5]CdRD2lD 9#tFTFMEPm/!RO9}U|ڵ "ia#1aI_ _F~-&bmnЦYXYguo+Hz0b:{jcV1Y¶[a Oʍ&I7N9⺏'%j>h860o> XIkI ,3 -,nI ^`-u$-bX)N vu`pp{qp?'%j>h8?7dtӈJKQpeMCO)^VV/Izn~iDۯුCkkilA# `~0'%j>h89lE#m>GXp;y+~^AcIN>o ՚ta$UL@!*LR0Eo}ſ?q/#RDĿJi}7+X!HQಅUafS!  84^ Ү柬[ؖcMb]| 0Y[2 n[@M57~,&yᥬe ̺+L.\22IljõͯBb#.-J}ڷMߋ? _FEI5;_ a5^O4{'@&oUأf}uDIm `b ַߊ _FFKK_@m?ϧ3]o%igc;i#,Hy`*};a]7Ni~̸9;~Nz_ѿm/#SM׊ _FՏK#w:nmciyP$y gG-#2ڮGXMҳƟwlti޹96LKC(29h8]V[V1 <$[xU6 uۑ ,ytyS[t(",{n!G5DĿG[@M5;,cOyZ<p䉋61sjKχZK=棦K~ielN';_ _F~-&jzZOscmzm٣k#n 60Ssڋ?Eŝڂ=7/<bP| slſ?q/#R}ſ?q/#PՀr>j7XY9 l:#b7%夌#=)2Wl$[fſ?q/#S~h7m_4~ԥ-5h\%͹̸FD.7ʹm =*]KZ,Mxֳ,!B qŸ뺴ߋ? _FEIˏqB6wEڶ߆;Uk%QCGabPx88/ ja_toKsKvOO빉wntk.-I}ڛgXR] ydFF2HWoeGˑuh6_ѿm/#Tv{-顾ǩϨ'1u8+>[Oi&˻[`]IK*7zð\ǂ\|y[oMi0PV !hf,:K;!I1[@M5ko4OK]_xƛ')o<"تuXXmlqy8څ[R[u41nHun3qc_'%j>h8Cg׿#U?nKV;g>j vKhK\'q+_ _F~-&/)~EQI6!&BI0ϽixfN&XT|djؓq(e,FH sg~-&n[@M5q60by&QuG!ƚDm-gޮ` `NH+NnW@]50x7 jW{$_&ӜnWGifI y}l~Zj1ݭrl] U8'Lt+Hx7 jaOoKԛc2|#nxk)ضAw`u>~\uh5leh1.[o #=>nOc(((PKa[Q(~%j(º]s u/- +.+d-/]WQɪ'Qݢ+"Š(((iyCiiL4L44 < kr?y-5k?9iіT$)'E`s;y_]覭J*E5jVu QEAEPEPEPEPM00ii iyCii 4O4Hg9In+urO+GxsM:'K1( (((% ?Y5nua]GK&j (Q@Q@5<4O4R1ii ay@Fk߾+ c<rVwdTh2 ( (> ?VFxJ+uZWA\sa]KKf % ?Y5u5xKA_jTw7hȰ(((4iiƚaa44 < !4O4H5jsZG?eU?  tQEuxW_)Rw$Ŀ MZBQEfPQEQEQEQEL4L4!yCiiƚaaM00x?9a&[?m\ ~\6;( ((o+lW?WR٫o "ºM]MrEu,{(,((() -!aa1ii 4O4HcM00gG-#2ںs\Ƴ#`mUOBz]Q]F?'%UjԬ,l#f89VxozW g:(g:?VxozW VxozW g:(g:?VxozW VxozW g:(g:?VxozW VxozW g:(g:?VxozW VxozW g:(g:eIf3X[Z˰hWʺ((9[{ PȡԌA8r7_ 1qrǢctx}+8U^Y_.(Y_.U^븢8U^Y_.(Y_.U^븢8U^Y_.(Y_.U^븢8U^Y_.(Y_.U^븢8U^Y_.(Y_.U^븢8_%\Yv #.FpHx8p1RQ@Q@Q@Q@Q@z}JYF+1,qsY<7@+qEp<7@+  ҿ]wP  ҿ]<7@+qEp<7@+  ҿ]wP  ҿ]<7@+qEp<7@+  ҿ]wP  ҿ]<7@+qEp<7@+  ҿ]wP  ҿ]oh~p(T*W''q?mQ@Q@Q@Q@xJ+uZߢ 51׮o*>ߢ 51׮o*>ߢ 51׮o*>ߢ 51׮o*>ߢ 51׮o*>ߢ 51׮o*>ߢ 51׮o*>ߢ 51׮o*>ߢ 51׮o*>ߢ 51׮o*>ߢ 51׮o*>ߢ 51׮o*>ߢ 51׮o*>ߢ 51׮o*>ߢ 51׮o*>ߢ 51׮o*>ߢ 51׮o*>ߢ 51׮o*>ߢ 51׮o*>ߢ 51׮o*>ߢ 51׮o*>ߢ 51׮o*>ߢ 51׮o*>ߢ 51׮o*>ߢ 51׮o*>ߢ 51׮o*>ߢ 51׮o*>ߢ 51׮o*>ߢ 51׮o*>ߢ 51׮o*>ߢ 51׮o*>ߢ 51׮o*>ߢ 51׮o*>ߢ 51׮o*>ߢ 51׮o*>ߢ 51׮o*>ߢ 51׮o*>ߢ 51׮o*>ߢ 51׮o*>ߢ 51׮o*C/nkQXs5ķ4y$39$$(PyXB-1.2.6/doc/html/_images/RuntimeExceptions.jpg0000644000175000017500000021541613152762205021210 0ustar pabpab00000000000000JFIFC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?Aloou;ޱwKQ@T(T :U|-A$)6F>ȕAx pN`jq=b"aڢN6'88`K=3SH5#p!54W΄)r8p ֹ=G!_k=z7^][ v/|IUȪvmt jmCI|[4v\m3}[8:=KEƍ MkzNIwc8<ziݎ][IAF0otmSX-ݼۘ٠  Ha9(ozAk-5n$rwX.Aܙ#ɵǽmn?ZoWÞod+$t$cXþ'K>j?XGCh@[Gd}ig QiM+g7Jp Gq?K!_k=i@nRu=\ZwV.$uΠfU69lןQ?ZѯcզgCu 7', ~x-ߐu[Ofu]7WKyV):, \W:w }egh\Ep)"a*Fcztz?Q:އk=HDqyX_$O,+mܹM''8z?G!_k=<#EI%, RO\7$^ Al9&Ь|=FN/G|Mi,sqa4/+pAOo1СƇr+Ddn?B*oCt?{{ǫ]#Ym8^-P-ɀZY|K` QƯuy~אC>VU g Xa&uQn?Zoeh:lsKqٴ&Iu(?F@t:޴Ea!k-|tP9f<%c|?cmk7 rm$';ֹ=V4= -ίws8Uq5<[ֹ=G!_k=Q@!_k=ֹ=]ֹ=G!_k=Q@!_k=ֹ=]ֹ=G!_k=Q@!_k=ֹ=]ֹ=G!_k=Q@!_k=ֹ=]ֹ=G!_k=Q@!_k=ֹ=]ֹ=G!_k=Q@!_k=ֹ=]ֹ=G!_k=Q@!_k=ֹ=]ֹ=G!_k=Q@!_k=ֹ=]ֹ=G!_k=Q@!_k=ֹ=]ֹ=G!_k=Q@!_k=ֹ=]ֹ=G!_k=Q@!_k=ֹ=]ֹ=G!_k=Q@!_k=ֹ=]ֹ=G!_k=Q@!_k=ֹ=]ֹ=G!_k=Q@!_k=ֹ=]ֹ=G!_k=Q@!_k=ֹ=]ֹ=G!_k=Q@!_k=ֹ=]ֹ=G!_k=Q@!_k=ֹ=]ֹ=G!_k=Q@!_k=ֹ=]ֹ=G!_k=Q@!_k=ֹ=]ֹ=G!_k=Q@!_k=ֹ=]ֹ=G!_k=Q@!_k=ֹ=]ֹ=G!_k=Q@!_k=ֹ=]ֹ=G!_k=Q@!_k=ֹ=]ֹ=G!_k=Q@!_k=ֹ=]ֹ=G!_k=Q@!_k=ֹ=]GƽKV4=\OI?n$˙$ܞ?**%OT6Z(7sHŰҴF}NH&T@s>txZfZ< ; _[5ts7" C]s7" C]s7" C]s7" C]s7" C]s7" C]s7" C]s7"Ժ6<R꺴ϫN yȊ2uZ^]^|/$#;60YrB|Q E/O7%Pcևy*b.̩#"Z5\&f WGnГ j MyL)nXJVnOY_kCcmi4yn\V~|#xԭm⵷L0#=PΛ@8Ly5N-o ;anڊ߲\$~Z#PNN;AkX5pxXդ-bMkȈNܺwQ$ Hrv7-yAAE3Y̖O~ұWXYCyW~:{iT6~d{XT9ki6+os`;Oq^WKk?5PI 4nWf7vț>E֙υ&uTwQEndQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE|GC?h(zѲ@WR٫WA@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@sz w6ҺJGiǎ4;}NocdPe  Җ[%?V?_G [D|_M`hoQ\oZfxkA2d0Fއ4A%B4 M+oA1& i$~]mTЊ4 N [D|_M!?V?_FmiC Я/&|?_ͣL5|O4_[Y J]c;@d~bW7 0~ѬxwD6VK(?C е_MN5D7.[bjtڏS:(Š(((((((((((((((((((((((((?h(zѲG%OT6Z( ; _[5t7@w?Կj(((((((((((((((((((((((l$Q:(f8T.'OK[Rz5#j4A ŧLwlZK 6<.%}M;g7*JҹKJ`iXl5 cH@iec WѼ57ya%Mw^dsYmp$'1RV:#.uq_oPvݷ+f+%j~&}so o8II)uV 25N[[ m5mǛ6$2 GcE.SE]լyhum،H }2*CS!$1M41}M;Q\5cOF}ppjetXdr!7>0Q7$KwB]][h&HcmL OCҶ?XTTFHU@xaYbm1RV~ x?_ 1 ( ( (:tE֭hd)"@W= <\iծ$ T|⭏1ޭih}?t5RUӴF?L̚^KuMWi8O!v|=&)!h&:|i{;G(~6>l A롢9=nB&laNz\hJDt0? VȢ8XFQִk}vZ\K֍OMt{5A,Bf=Y'$>%E]KJ`iS-6((() -!4Ӎ4yaa23Y ?MkLgt֏R*t65 ë59#15ݸ\c)v"b H=F*j+s"ڴ^Vakyn!Y++9/u=,lcHtc?l5{laHGiƥYl%K!( ~yԣn^[H~ R*V  ຅9n"Sohq{yt'9g{auB AEs>!#O4F2>7GétZiG-@ ϏhOB5w_C1{{Vki&8e? h(((((((((((((((((((*?-~PGe=WA\sa]KKf ( ( ( ( ( ( (9_Ÿ#i,5j1 +ȥOEF|ʐv㎜/";FdA6w#@X=Q >g-%r84;HVE.$壐Dm9,=Po>Ё d#|'"IwmE,Rj$Iu _hx aϮ;5G&g#ToAhԿmHKkyxhWbŊ@r #d3yxQ׃Egyay۵JyEwÑ\0?[ 3}u._KK|ҼLn,wͽFʣko]%+g|H?xv1Z`$̪'Ts,QG{ƪ37}.{v8?~*ӭmԑy/CI",{`$ɹox^Hkڡk#1S&9#s7}^an> /?KnZ7_lZ\&f:]d#HHs99+'&>!m^uTKan2ї Og^zc7}Nmgj3^א4cI ZP1%ʘ^EFKH[?1\䃿G&w|;ӡdPk=Nga8ÊOKyƫ ~#ѣTiMUM11oA8o@inz^ x?_ 4{iPXb[hwΣkX!Kd?A=tOM,Q,@Matrw6iн1E>x~)VitԼy_;]HiKV⢢E `0sZxxfHRHڞc~ ?OyZq? 'RT=ۺf{6LɰDZ ( ( ( ( ( t 5K}BShbka bH:Ĝw(o 4`MWd;o 4`MW*$E]{}LZ6Щy矧z~5ֆn5Rݭ+0C r :vt-"hϾ&??*GmSv5_cho 5Ud+ş2j=_{E]#+U,-W5QG*gϊb/3\[-_R/>;o n TҽFvZM;pU2Z+ QE(()  x @t4v)!H #E*N|u{ؖKOy/oc( viXyc:{A jssk}&4q_?76Cx_؂1>m'Cslma#H *( ( ( ( ( ( ( ( i:vZGۈVAEsΙ{gcFcU{ྲྀ0goC翷kN5/ :a*\>Y$1,Gkp V@UQo- 1uI2Ճ(e #-s6/co.:ll3BOǏʎv'#R翵|GgKLW'd<}jQM"iFn}4QQ[[B[O7G)EK@r襮Fo,;N-ޣck5lĩnU*X` îss*'uEs7^&Vk@C-ăKQAD U}9]3SV4RıO(K ?p$Z̳ȑ%cMG3R zUiv9g7jD 2|W,Np Yoq &FZ/)"c6xz|iyec-k>ͣ ZVeauErzݴW~msR~\rBP-ЁYuO{m?chn.rM>qv0;_ 1G+믦n|dtmF}*Z[r;*K")rjghMn,%LC tt&=ٚaI|pnux-t3L\mNjHP}6Ky[D't+N[уRInt<)u2xf\O ]>7PkT-lceWK~RՏ @t&oCh2>` FEw=?Qho+lW?WR٫(((((((s_Hk^Ml@@ Z(((((( u j.nsE4??PA( ]#]k5(h7e%_~8g5l\Y#o2 m Ef7zmZOJ m.خe#%g訢(((((((((()FA -qӍ2+{=6e[-9|M|t4O̅u@ڼWeLӵ$^᠐#ȕ&XqobfֲFWBN pHk:vM}DV >nqZ@c_n}IQ6eO洊٬$\Ԩ$9HHHbsާO ,ت:ܛ#%1Y8cj/G?5e?ߛ/G(AET3٬,q shtfdt Imy4/{[ڛC~lG?5e]ޔu1fhݻfg?wo>jMGNMod/eFw19HT8kS[6_B:XZjڭ7r]4faGXM\6 e2{9 `U8kS[6_GK[lEbct,oX1NrNs6?P18%t }s"O o=4 z.{]%/%yKa2ʬ]$!bڙ y|G{r.{;He qr:C~~t KkY=Oct`,X%qđ]ؓioSD{,Ƕ1It]Au/gà_6?RohAM%a\^x%ơq0VF s:~-Uv?fɪ߻3]VB8Oɪ߻3LFTTHR̖8rIwxͅէZc.'YM$ &?*-` FEw=?Qho+lW?WR٫(((((((diPEQo._rzXխ[䰎(cy<* -Iyu}X+yȅOz` Iy[˗mrI<"dIq9`|ArI'cBFCeRK1]Y;,h@Q@s WN,6n]Xn`vk8 }?,\k:E U1iRoVu&03k.{RAI+Š(\~ IdOGI!C1=MiWSZ~ԥya?ٗT \E(P-WKt,ն6]׍ʺQYs4]]V7,m[*ǠeT ( ( ( ( ( ( ( ( ( ( g-on_ϔOPJk[ҸHRxrI?E#΅n5iUXucߢ(((((((((((7Xmc;eT0r*\_GkWŵcl7dT?PH: i֚w,}oQ AȠ TW/yiZt!`Eq`@9((((((((((WO7`_Wxg:~N-{m>k,aHȋyTM\yj&Tyj&UwGKEs_h~ ?h~ ?attW5 Q QfGKEs_h~ ?h~ ?attk>;5_^i։QfGBi 4E{5S 0Wj|ksU=4X'ƚ?5_i<_\F/ @'y(TN.Q$Wq}#< 2XaӵiI4&m4z5Q[0~PGe;J`lP7@w?Կj+o+lPE_xVK}KF/nM2Y,S@ !3u[+~0ևy*/O7%RAΚ|kC0O7$򳪪]׷,6sRz9' cCDYg5 B[[F2Gnt|'g#,  D9YX]j7S+cf[ǰGrr(ib &={#;+|Q5dM6${`=+xaYbm1Ti(b (9ȴwg&dȱɉ+(+5 oYҭml.}>IRXNc7`βjѴSkgm.d#/p~f~0ևy*/O7%RCfRa[jv#v7fSrz@֮&CEƯk.wn ŤJ<|ܜpGpGdC?TsgMEs>_?5oJ?TsgMEs>_?5oJ1kCZP&>ؚw5EgbiϿ>ZP&>ؚw5EgbiϿ>ZP&>ؚw5EgbiϿ>ZP&>ؚw5EgbiԐiVV,CסO\ (>` FEw=?Qho+lW?WR٫o "ºM]MrEu,{[=:53m<oL׃O[Ke65Wxʭ:pq5ú5 [+vO5^j/ u g; 5΍_C|}%&A(GLT3O~EIoo=NI(IQfcIV #y^,/l.V<Ƒp˷89~#Vy;iu3#@Y Z)<XSβ4̧rw _T,ڼw}>Q,prA쯿ItDDlu+;0f:#ȫSҼQ|]X oӯ [A#E8+GL Z{sCa֬k^8 7̮d~ARkK[=$ yxмucΖͮDkT>j%v@{0<{wZDtӯ+ЌdsP4ɧ}n;[{k 'y!z0Fݎ1ה_וw0םĶ:ɱ Dސ]|iosKխMRXWtH?ҘSMbݵrẨ?x@1BJD</a *M@#ZLnhQEEP?wȧk$"tQEW1HcD)[Tbc_ڹV6̧t9ӑ`T7vQ n"2ʁpsܒ:wuKIe}wrZD"&o=bۖDF\V>.gk|+ϙ' 461Yvyݯ򿥝NJb7A/S\w~ߛq-ez@P"[(ppzĶ]ȷ 2 C֟Jz, EDdֲĚڇ|Z֜f[2nWnsq:AYjrˡi$CqH"2TSHFpsoA6 #KVKmݙI9y}ZI_Wwf5i>עmwz1X%Tϗp|+ך x[ Vr%ѓS%i"`+(.U{_|6~Y?A`ۏxoASr~-m됡rw 1$rs]g'u?Vvd6((*GךYmi6@G8uk>9It?Dl)C44`rr^FYh ( ( ( ( ( ( ( ( ( ( ( ( (8t/uQ{ .`DO۾G"v=;};nuUdu@['>u8TB ګ34Ga}nH,Y_~޽T>\M$O?oiԭ :4h0TsvZUsIw[ *JΨ#f< ՛wa}}Jrj$=3SyS1//?0n^ښv ֱW8ỎXzӓ]'-VK#$Ip`3=1IwY.kkkclԊ1)VIֽqlٿ?.s?yψ=?Uϧ_[^D-Y7ڡ8ʓ#D</mLkhQEEPEPEPEPEPEPEPEPEPEPEPw=?Qh*?- u/-  ; _[5tWĖ6wA40iWS!LJHʞZ % ?Y5D*; >iVͽWPmђ@8#*ZB00?[ 3}u Oow $ۿ٤Y6;@ϵN\BKl3: CIv30?[ 3}umies~]$G 3}ui~>hCwvIu*uR 'SCn8 \z~Ѡrh#7}^av> /?ju3ۢ,̨O|zК+y'1Dk(,S9Z,1ϋtֿIyƩźok?%U]e=0p~PsV^QPr$nGͻn `fIbf> o?0Nmgj֚ZmiL~_ơ:l,a w>Ԯ]c ්I] ,˘,;j@#\W_:0ek9}*tOЍoKc QEj@QE'E/vFȟa]QEz_U:jQ6mvÖL秨깍C+EmS=?0?[ 3}uن)̢&bsF`-cz?iQ >\^W#Ă{qF*q`:uKM"MZ"8Lx{E~}iQ >hcKia]Jj NuK 0k9kX5}\vqj..L4G{Ʃg#Uv\bE&R`5bY#CHX(,p2N@AYMmkwj|]϶K5ZjvCM}m[<*OLϸVӧkuPAhLrWzzR+[>-Z%VR훶 gnsZe[}6BzuW)Bw'Śwk?%T;}M[O-EhĂʾ`R3J5&h'-Ntpcxi; Pcol.<Bi4nA10$^I]Oxno,sBeI#`nAk ޖƦQZQ@s7+u?٭0s+fg7\>B).we5XA閺}%1ʌ@h(((((((((((((u-xC'S@c# ۞x o K6j'kVvźa/"7Bh^'Rvse`c*cWA᫿}WWVSƪř@1q _ _F~-&muhs?]=S fs]قgoA -A^^Ͷ|/wC9KΫ, r^ GIp6qZ&_ѿm/#Tf?ѿm/#Tt$5ol Lľw.t͛wdE? B5&Kot6sYoBI\E)AH? B56mI%d ($(((((((((((*?-~PGe=WA\sa]KKf 5oށ{os sC&+"Vl5+à^NjDEP7q"t]?C6}0#1fU,sg>vhh$ TppF+;Aum?6Z>P$(Cdmv8ڴegX]@%Pn={V.\NZZDcP{s;XY6gښ +%ڵ{i#I<1'z*i^f.ll U@ۊoa#v;rO$,M%ϰil]!bE'8{v ZY["χcS6:n[j`B"ۜg?g{ oHn/&q}иK}bdo2e,JXaǗ8FlI V]kv4o)U}K]NSbx\; ϵiLTI;׿FTZ߭-Ŀ!Bn*>麲mewr %X%!oU bh ԗ]GINS)"Mt;lE$GPC Ďj 6Aqf(L"w9]֯4aKm;AԖ;n"^ºlkBTFPn@ܫՒIb "c9Ȗiʏˊ|6ct<?V7M%P^*$,(aN[Xsu``|;>n|3^c}Jj+e~E'9-彈*J*oe=\iXNHK]S`UҢ1{kcE] x?__ UWfQZQ@?M}яVV0UX0}((((((((((((((v xpI+níX55n(.0HW3[Ka9uӭCHe#2W{nm>ްm|VѠvA$7͒߬v#m s^I3*zK>bm1=ͭݽBR )păqzxh16͎M4l}ȯ3eZWڡرڛd5cçD.wqu$21 { 7JEj%vL|rH3shCM)#-&Fx0fڤⶮ- gtȞcz`y0zsswLY)C(A;ϻV v$ҍEO"$סEZx-9BN7_hkwBpG =bw ֵ6vls8+e*y`ԴRrHv8ԒNd1mu#9vWk2e[96clUɴ.fVhmW=^GjKm̫D3A$XܖbI'{G*VǗƺLw6;25i'$hcARt5ox]# X`W-z7 9w_?Uv'F?XTUh74(Ԁ(((((((((((;J`lQGCº]s u/- +.+d-/]WQɪ'Qݢ+"7.wl-t9DR@Il}9:X 4Wcx*ʤcI(\gMhZͤXIo &( &zVP Z({FFbQ2p8VClGeoͺ':ZѦP;+2#%N1ǧƘjX#:}KUY9UdiT< 99,2:5)v&=݌nՃL4oBJӴ$X¨_@ymvs1 Ҩ? B5@1BJD</EƦQZQEs#H "6h ( 4O‘th_#+jTw6袊İ((u41Ljj3R(aHj3H ȍ覮+ mj<7 ?B3lQEW;nt$'~8E+WW;:yNihdTj@ 8REQEQEQEQEQEQEQEQEQEQEQEQEQEQEr8cx!~mڦm%:ݼғB<GHnshɨ+vw-5,3MV|muTr5}vh-淹7_*'̈ǐQ2Wsյnh%M+_֯<~U0Hߑ ({h%-&k&[ Yy2GVn>شt ۰|t& Nw >JI;T4{: w3t:ŮVi'JG8S$ϢL5Ǝm5sڍցikvdπ\:V(W7(\&؀ V=x8]Mlɫ҈#[MrvTvm{n]~xoÈs'ѾU鎲>{WXmGSMrcE] x?_/_?Uv'F('%M ( (((((((((((*?-~PGe=WA\sa]KKf % ?Y5u5SUw7uXa{-XI %۩52WCNMEr>-Uv?fɪ߻3QG_Er>-Uv?fɪ߻3G#duW!5_cho 4r0G_M5`MW?<[C&~9a_ɪ߻/3Ic/3Kٱ4\#*U,'#^)U,/dΎ `3_?a/3KH=#cE] x?_&kb45;Rh1?YuuXJKm6(]{Z.*̉;QVHQEDM #+/:'PEP\Ɖ!R?"MSG5;YoY%h<2&ai}jdEr>-Uv?fɪ߻3QG_Er>-Uv?fɪ߻3G#duW!5_cho 4r0G_M5`MW?<[C&~9cW/?dݗwgf=W4::cQ?W zei?O Zei{&>tt&5ϊb/3INJ?b/3KH=ȍ覮+_5 +{U&TŘܬ0FDYhZY9It?Dl)C(((((((((((((((cD)[Vbh_#+j۬e(Q@!4L4L4FiidmQ3Hg;/a *M@#\_,*4OЍoG2EVQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@0~PGe;J`lP7@w?Կj+o+lPEPEPEPEPEPEPEORմn5MBp%8'ƀ.Q\'~C?U?0TQ\'~C?U?0TQ\'~C?U?0TQ\'~C?U?0TxI}sֺ O %ѡ-6$Kj AV'~C?UtW? ߃kcG'~C?UtW? ߃kcG'~C?UtW? ߃kcG'~C?UtU=7Vuv K4,$g{@Q@Q@Q@Q@Q@Q@V7o'm+kh}%S\>ha}kOkcL!%G\مtU[NK-teK cʬEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP ]_2^i}!Vh218\{XBBtH)VPw3W|xr[1Fcc$q"#!ٶw,RQ6(Fg9X`ypT j[wJ2?:%imye\]$`$(=$`+Cg:($VxozW l[}I.ɳ:|c̐ʠc&;Yn$ 4;tU$¹_YS˲0o 3z|<;!sMmX,ۋ{ۘW핰}ao¬GZ_]yȏWGBLVxozW wſ xFVm=OiԤĥ~D|aR=V}5`G%'ZDҭ5K\ Sa۞26 k¬GSM:ݭ,lZ$2/" ww_Xԑ-0czgՎWg:?VxozW ⊡}C+Hl.xhn9!pAVV# waC{f-B.9:IcEe=~"Ӣi.m˻AsowL__k̫w]sC95]&'!WO('{W]\_ޣ-w-kc¹(awuNe!gI;gvKz:GzE ESQEQEQEQEQEQEQEQEQEQE%OT6Z( FE{sa]KKfº]QEQEQEQEQEQExBtuxB'[_fgGe I!O2lga 8N:b60_O]ziqQ^oD'/-7\Le2*V\ i^S iw鸵aF?k>Cv^(bXmTw^kŹԴijӞk++. bS۸ISGDKO?:>#i=IJ] A!2:PnT7>ltJ&hSew<'i8.&S[X|FIL_{*F#\Y7CCof`<_:Vlmuk>6Ky["yq'-~vZ5*I1%?)ljy[.Rdg- *̸ןx[GmwHA([*QEQEQEQEQE_[AGܿ((ַ8!ypƥX~GU j55>4EPEPEPEPEPEPEPEPEPEPEPEPEPEPEP\]_:JK%<ґ{un0wˢRo{ ڃ R;t\_L-4{dIrK31嘞I<@ i65Z#wwm+ǖbzV"8g!E` u8gڥ ( /<5^<Ch->bfŚGW[2 S{\ymGCDZ( &EsurSI.\;nة8ڋןzԢ+?Z 4ֱxT$ ՑԃTVjz3i:kI%f/$ρ#;,I2IBZȦM wI ȯQцC0A/ $6S.smrd@Q@Q@d,wI$z#^ې$AӞ}U5EsΙqc݂CD'9TpAwoq sC"xPϰj&L]?caOERkf631GR l:Xz ](((((((((?h(zѲG%OT6Z( ; _[5t7@w?Կj(((((((s_HkWƖ^xbo'V.w'NA'^u=#"+g0Gax'5ђ\Q)̛v#,y%&C~lG?5ecBK 跗F{63.Hȱ`Í) xOH[DXHE`ɰ38F*?G?5e?ߛ/GiWٚk%ѻm̫Ns(8aǜX>˗61dGn1Ӿ3AC~lG?5et_1K٢.5 0e ;`: à?6?Rۨ&\ޤ-JE *F\t9i[ZVFݏbKTOj#j?6k?SN׬߫O1K1]8+k,֡k]@fioHO;Wҽ"c nŠ(QEQEQEQEQE+] ߫N-h/1QJt +iGP?v%'tuWRմ˭>I&ppF2chB{Gzr53*q =VQEQEQEbFYT(r$ʝ$_cA梱 ^GkaHvٷ?a#߮7ŚUFvW|5g?/?0n^^!^_m!4 kŽWgk <ֽMзi|/WW)l'(O?h(zѲG%OT6Z( ; _[5t7@w?Կj(((((((s_Hks_Hi=kQd|{SOP#lc<8kI:#:|RylrqN Zq^T,4{6c lGĺM{]LűRH`KeYL!|#R)$so|c}Xol.nddXicfzu6C58bo4 v:񍿍tOOHZV؀l~@¤T{u!. iZ$YL])764aIe$'VL@\ ]Y{)MII%YA>E١DS>6q8#[to_6[lXC]TĥA<2G5aaƤ&.6mco\:y3Z,OF =Fp3k"0r9㯡=,9Q+oD6{ Y/C400̼1Y]oUG:} Dich\c%[p022Z0طR?rz?n ~{ 1x8Қy:XI+^]8+kϼ-#apW\~rKvQEP((((z>yʥ&`{=^w^裘ğCF~>.sMI-mn= .?g%ořV((((((((既}OuknQ4qM lQ( ;yETeaAU4ƴ?5j4-KViQJ&Rj0; E ·y&[Q7$֝.&,F 72{@|2xcCDT;VZv&*9\qF<y]GTV}J&m%Xx4wz݉X$)# y։}>+KMC¡#=P`>Rh)kDfK"[ BCy5!U39kj&uWQQEQE6I(I*(,z;[EaeA|CX Go }*Rb (((7‹i1 7>:״IJ<U!q?^~T OIY` *( ( ( /(/mt_P4_Jl5xOϤEc}!qIcr`V.W>?h&+vլ-e5`Xd} "+(.YH.Ȯ00s\π1a[[}DMs-'eFx$vqV> XIkI ,3 -,nI ^`{[˫MocHN7";ĺfs4MaO49?#g<8,Owec{60C `;S#; F&2jϩjs/͵2"r1i_͆6GkhH<`\ RsӃUnKcp]N񵄉(6i;שZqYiwRipܭ3s1ѺGf.WDh6b>An%v>Ee?X|]\EʦEP{wګ(Y$n?Lҷw Z^{ɶIeI#9ŸV}&Ŗ,2ݣGg #;HT 3x(:o,Y.5spmsI&J9$;^}_gL֔SXD+pd3Qpiz̼EW0i^$е(A;E {̖1k#ZZ'Rz.#=4 ~D"uyl"0 zJ0mn[)G Yi0ə_vG-u%;nkiy.v?ܭ28Кjl{iߛ7Ȱdkvn<ѴcV_I6L"Dv4R(9 vFj\UZM;4ilkyV%>`0̛o#;kGz uG)@m䭭BOs) : /Ll,1T`*EPEPEPEPEPEPEPEP=_AaM;Ka{>%4Rxh%* &qlH5ɖ ;)gb'PK` =/L4G{ƫ9^)e, w-BW\0_8t_zĺf@:Bi"]MU[ɕ*>\)L]owjL4G{ƪn~=?ϵD)kGfWK4#bF}sa[-n3R'L.a{H,fd,mFe H;taϮ;5G&g#T]^g'Hu=JuP]K8b  ^8<ߺ|P \YK{K Ee\#y J\yz/L4G{ƨL]owj[9$gs>c@<>LuY9#:㡭3}ua~>?&yYh^//.f('Dl+t*ŏ%[kayKd h07d mMmkj|]϶K5Ik[k{aQa$UK}Kς?%iXa9#'qZٚ桪iNvAqyNnC`1cׯ;gźok?%T;}MyXs:- 22uc'=X#!6;HAA#Ӛꚥqq,ŻjuS?MwƩ9=t -? ?Mk븮go]wbQE7v11Y)<}k~VcOgoE "cE ((((x{SŦE@@9]cxOG/d,nqSnCƀ6hfĘ.bYS#3;ЏZ@Q@Q@q#Qi3fKBXܓq9+Կh Ѷ?ko4OK}ſ?q/#VDĿG[@M5oQ@?ko4OK}ſ?q/#VDĿHn[@M5oMߋ? _Fߋ? _FϛEL7~+.iQWnU@m50x7 j5'ŷ>$o}+JHN8wSWl '>+ mj<7 ?B3lQE%OT6Z( FE{sa]KKfº]QEQEQEQEQEQExBtuF᷻mMoI;"[j͍̣8)=6kU5U5l.<5_^?<5_^,hkU5U5.<5_^?<5_^,0<|wj&T .VGB\ƋWj|owU=4X75_iWj;t aU=?UE.C-#apWל2qwV"xYZĤp7+ѫ;#QEQEQEQEQLXGfcM`O_[AGܿ((ֺ*R>VV0UX0}((((((((k ?)l5Y^5ӿլ+2((4O4Hc FjCQCC5#TfaHj3Hfgt+Y"n`_]vEP\?5=wW<e8?ֵ%;Ip⠐<~5t<;Hۦ7#.ߋӢ(((((ѿQ-GDn-ݨYzmfd;Jd2EclZLi "%O|$*V3Gss$R(tu9 d@((oR.FWI\ޥ%E][QEbhQEQEfLjLc FjCQԆ4 mj<7 ?Bȍ覮+j;3:Q[0~PGe;J`lP7@w?Կj+o+lPEPEPEPEPEPEPEP&>ؚw5EgbiϿ>ZP&>ؚw5EgbiϿ>ZP&>ؚw5EgbiϿ>ZP&>ؚw5EgbiϿ>ZP84+iX'֮QEQEQEQEQE+] ߫N-h/1QJtU4񎣨`ӣ|6&#!/:Q@Q@Q@Q@Q@Q@Q@Q@Q@4-k+ƿšwZBQEfPQEQEii aHj3HhcTfjԱ5 Fi Y"n`_]p ?Mk븮Ә(S&~|(PJ"롮z?ǷsuK[d>w!(((((sd~-3BJֺ:Ǚ#1H}rrҷ?QM?Z^-v׾sf?G%?ttQEW7@m+gN Y^4j&ILE]ÎՆOg:?VxozW ese¬GG* /Jtt{0:+Y_.U^auOU^Y_.fNi\* /Jtt¬GK9К* /Jtt¬GG9j3Y?<7@+  ҿ]/cȯ?A`ۏxoASs<7@+Yg۴^g-9I\*>` FEw=?Qho+lW?WR٫((((((((((((((( oj7^=խ4Eg"JRpdt^_?5oJ|k ?)l5vh!nl)$ZFy=j&z/O7%QZ 7VO,D$iqd zzS.E彾#iO*ȸܞ#'EG4Fw h'aAUmS<1<Сgzphaʌ/O7%QZ ]"Qw3zTd<`?1oI`?/oIZ0LVK5-i,;asawݻH$RG^A**(ib f5>H)A3P.n,tHUw@ {ڮgo]w`QEQEQEQEQEQEgzDz2\OmئY۽9E#rA^mBi^&՚0i1d,k 'dݏſ2jwEC8Oɪ߻3Gdݏ,?|[C&~>-Uv?f( o 4MW(. Ǫ_fǪ_f(]W Zei?O ZekU.?c1jŗ[0ŗA,{39hbXq E328Һ(W=xC)l%e?S+0u=_*&KO["I h((((((ijU֟rsFNb:*u Eַ ~8$Fq¶+$3㥦 }5% )?z袊((((((((((*?-~PGe=WA\sa]KKf ( ( ( ( ( ( ( ( ( ( ( ( ( ( (9 i[ r^2߉5VO6ХbLySFwGۚ|y2a'p#Դal@ c'E >g;4\v8+kroHnRZP+'WYX};ԹLFe܎ό|L]owjL4G{ƪneibx lV[>mE%mi6 @'"4jiq\N/)#c\R!aԒOaϮ;5G&g#T]$s/ Linu n3ynd1 zXмGgh^NӖސTWW >iP,c}ŐYŧmTer<' ~bqU4OCo #SoocmLh̗(\n`p|_Ϯ;5L>/[or⽂X/- ~ٙXy9G5juxoNڀ,8Nk>.Z%iPI%~'^fV{h5TY3lU+0 j4GkoopdD61[v=z|[϶[5L>,ӿY-w+iuĖ:ɱ D]|iowKmMRXWtH?XSMbݵrẀWOKyƩzwk&T9=t$e&uWD7.1 ( ( ( ( ( ( ( ( ( ( (+_r^_ik7<4\X2Hcw?Rx@SNkVRI\51ס*(2; z a51J(ew?Q ߃kcZ=r_!kg=6/?Ĺ$J<+xf hba y?ӵ0AR51ס*|E ߃kcG'~C?U8ff^|K7 ozm;[ dqZZ֞6d1ӯTǙk^ZF\5g`*QEW,伿gP+y9#6u.+m~rA݈' (2<Dʁ.2ylcZX2 _c3ey撲ןW^16j]شh6vUDR7@O^^:uŭ'wэl`az{|!>cb-d f0`C|rssj^/ XD0HR&/  r}V[ mw25?.Ye-!}{=rDzxU^$xnus#Ə*8DǨ`_$BnhG}:HK3H:_ 鏩M~>J`."W`Q\)@ڥYo_דwG'Uν{6"oFeQ6Ǻm7g~Ѥǒq O n 3[1wJ]߳\wnn{px V2Y3y (M=JMNke]]t;ɧ^&rya^z,~/ёFtm^].2 (( Gp>sbn~<&Ivq) !ff%q$pEOؾJsiBw;FF^7~ Zri6ygaf#nv?q$p#?+c|H:ӢPMI[aX.;jt]OR:մp".\ې+b tV^6CD- IP =iou|ISm> =鳗|H!>SH*Àxno5әmܖj0 Ng&E8ַn/%%`yLmvr#nqR`5BZasIq'??0 m4tY܉9(;!%M+ɒ#0+3E`I!@ZlI NeYq.ğ㚧|;kCY#y34j1|IH'zk_YeDK+-ȻB۾ ^<C,]Y_]=@6?w,ԝm浮|-܋_4˨,X3@OAMD-ai;Ks+ Rʼn&9&տ1>ѥ0$r\,DZU 8˻*ǮO0gw}edWV+{&;VyQp&uGw t+7&k|?qyqwtvcI4ۆ;/ :O خ(((((;J`lQGCº]s u/- (((((((((((((((k ?)l4sWͰ/3Fр2qN ֭eStkMW+(HSn8ZLXV m!npGUᱝ;y ̪O9\5* '9O4eD GDGX }ʇ[F&dKC*M$./6FG>ª\SFM9.mm\ʕ*Îz>miajrNrN㐠׀c tMg,P1uY#b!7F:Sx{mMm&B G`$+؏䳵0#@r1WzUvt{,sarO*I{ȥ>{aԿѮ$ gG@t8g{귷>}bg!@XПqQcEDPP0&цXd)*QVӯWK%1#Eq57sH6:3t$HE[3)!W !{߹ߴ栎O2%m !NG N=8( X"%CƑ(Pҡ'מ,^%}qSM68SOߟj5ROa:ŝO E2d$_0.8 FjCQD ?Mk븮go]wsQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@׏#i0 RM?0#O o=Y ֭g2`?ߛ/GO o=oQYܣO o=8kz.#zOG?5eAs@o͗#߭߫?GsAԿnֿ՟#۬߫?1]+>t-GgYaе5g+5q77^2~ѫ^_!]ۧu|9X4r?y-릟ŒgQEdQ@׏#i0 RM?0#O o=Y uˍjmio:%2@#6O;4iN<"G?5e?ߛ/G,QK0 z׮oyol]BC_;sq3#z?p͗#l*6Oqgn8ug$r^3Zojj|-i_x5rN;<< nMbsO o=0 zSke\<`+|&u$wNbKE$ve۹~cr?+[t KkY=0: z~5嬶#VI%%]H5Yi^ڒ ʳOy>Y1{Tl8rѰtKgYaеug*o,ܴ0+_ >֦֬cn'$!D@n})s\(tt-GgYnuڬʚ|c;Pm8=8 `xDo6E543QI]OXt![sQ@Q@Q@Q@Q@0~PGe;J`lP7@w?Կj+o+lPEPEPEPEPEPEPEPEPEPEPEPEPEPEPESԵ[ \7X y\(f=<dK6Z`T¡|k ?)l4sH .,RƱpsv\NJY{q6-ƥc#5aTe'}YTƴE*0X'ߎ+;UYh\"\3O<<8ZTVm\˕nt]fK1IK,4֐mTr3t2*+/\H. ;69xoI `8#/`wtRqZ,Dr0iԐ[w=༂U/Q\6g=z -Mn f oXV.n%^IWǨ́0s'̓?R:S.%YĥYd(x v8'k`|;hj).cӼBkQ}TSwܮQPFfN[i2r ^YfwV$ǜ=oKIۥ.ޞ}y#p i>lG?cYWNجQ$F r~c3DFҠFW9ɮŪ3RַkI_[Im0BDrGr9XsM5-5@Wڳy&g]i+lW3>ț>Eq^yT𵅴WN6$YXG#9WqQEQEQEQEQEQEQEQEQEQEQEs5ӿլ i[ ju QEAEPA@0ژi f5(aHj3R->F[Wךk?9iіuOF3($(k ?)l5GS#n`qI>_AaM;KaXРMK=Fss,`s#~5ZGPs8$t"* $Mekm֡ -cp-ba8~ǐaҮxQI]Piv[$QĴYv$$r9'$57p>'dF# ҹD^-R,ⵁB7{nmix{X/yWm]0=%qhN:qo\/WȏBeYP<#z;fFtVtE,dgUH%x<b&ڹa6z֔JeӰ$R:Ո(yvɥHg%۬adHzQr8ߘ5nmdXNQx99u5KN𥖙> d}>_"W뚩v&($;r@A:Sv5|־Dj6U/t|XFGo6yF1ol UKiZClnDh$GaNCE"~Զ{:X3 MZzez]ZH+{jJ mjksxoASlV?'u?VvEPEPEPEPEPw=?Qh*?- u/-  ; _[5tQEQEQEQEQEQYޯ5(V6wE@ʿyR+3}GsE+::+Q;\_G$ .fttW9 >Bvl"Ie]\$ ?'N?$QtgGEs'k)?)?\_G2 3JOK/P?$Q̻Q\%(k)?/()s.fuW- :uln쥴q(P?.z6.q BXOqz ;9&'Jxno‡bd@T3I':mBi^&՚0i1d,kp>-Uv?fɪ߻3]Y?|[C&~gFI'&( +#$z*''+umN]gganvƌTN}I~|3&+nt{G]֒N6#Ԇ-Bvl"::+Q;\_G$ .o@̝/Hes.ftW5 ] OKoG9p:j+̡?HsYE.h 3Cv[uֳm[5*4,jHYcsWM4QE0 (9 i[ jW4-k:(̠(AژiL4Fj3RԔ0f5r?y-5jAEUQEs5ӿ5v ۬]JfS6')h ֛D 8#U7F_\d+'\.4--yv!ʆ9Ÿ\`NתV6צqrx%Yfoȸ4t id_!^'w.T BHd9-/!GpFXqeq_T0I p"ge rY`v/ ipJ·s:_N 9̇o{Rs+o+mv#}=)*[+f屒p2IwZ_D]Fҡe6.1xtr995Z QtชvxWh}ٿ@Fr10h1KR`Вvy*i|9Ky%1F.|v h$dd }jq$1Fs-mNT^֭71%Uܣlao;De) cp1pkKytR)V\~uiW3mDI%I$H z};2guhgx7eȩ#B۲_۳v{֊hbXXb3+XHN}z. 9ڗ2,d1N=EN\ҳӿ٬ȍ覭X3 MMnc<7 ?B++bp(((((;J`lQGCº]s u/- (((((k ?)l5Y^5ӿJM7nv$@$GN.EEx]K=0jiVܶigh'a1E{KچuH#M$%L(T8rkKǰQ^aeJW1[ښD|tڣ5a6QqFA9Fy[i.E}=zymVj\AD3۔mgvm=p>5p+xsMFΙZF{g5EQEW%&'pqpۑ)rW[EDeƎa+>cӪ22"A'ۇjI[O'(pfd?}޺J((* ;mBK[x-^)P28/跚FhZɤSOgw/qHN3qЌb sQ|kuwɷO1l$o,/dXqk9EfK@K!&ub_ɂ̪|mdЁʟ5I%&_iYc[fH]g|~sgC4_֌cE] x?_0P5zv=OV&QZf$O? B55ʚfSwFQZQEs5Yy }u©<Ҩ7Db`pAѯ2¨ɣK#He'{rORӱyj&Tyj&UbiϿ>K'k5G'k5]&>ؚw4r g= Q އWCϿ>G&>9͟hg{5M>9?WMϿ>G&>/fWj|ksU=N}ƏM;}=;9M 0Hz v_ؚw4biQvyĺ:Nj4!Actؚw4{4OtO'T} u?ؚw4bih|ύtoj'TM{5]w&>ؚw4{$㏌VGKaxSXd(&nvBɏ:פbiϿ>K e :OHp&'q'ƦH ( ( ( ( (>` FEw=?Qho+lW?WR٫((((({ƿšwZ![DC.ȡB A/A%Beޢ ' h_+h/7A%B? ' hz_+h/ Э/&7 F Z> ' i_E|_M' *kekQ幺HPdf e5|?4_xS"i1&j> :7E+B֍5:S`v ? qgZ/&x*Ofkem jdP68V"{EWAQEQEQESut&QϕmHzAO@=Md/MnE`7ROtu:m7Cnof#!{ve@Q@Q@Q@AմƲC*d2X~[xtX妷98I5tx[K, FBHR29REPEP=_AaM;KaZxa-"IRHPo!x  [D|_Mg2oQX?Km4/Oe՛V:B+4[YZ8o&][pfZ?V?_G [D|_M(UQ ' i? ' iX_D|_M0#+SͣQcS"j3 г_M-l01_Yѿ/&|oov2 Ҩ? B5&΁p]Yhmj[%4u@#H? B5/ʦQZQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE|GC?h(zѲ@WR٫WA@Q@Q@Q@Q@Q@4-k+ƿšwZBQEfPQEQEL4L4ژiL4Fj6 F##5o#Max[GmwH)|D( B((s& A1/m&WDH@5xLfO:*( ( ( ( GEC+ # Z(ö5׆bNf%!i?$̎S?i_6>$?ҿm'#s#5W2u_5\!&Y?a5o#kć`W dz/S7w[-јG*t\ݓӽ]84ɜZEVaEPY!Go"A%;xXb뜼,6LlK/z4ikhz˜SGdufj又HOGxJKCGN\|HOGoć`W dz^]@1BJD</לjskŴVieBg5 $`̒)rNukOЍkN--HMhQEEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPw=?Qh*?- u/-  ; _[5tQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE 6Vs]H#IUQ!Y4.){ogVꛀ/>'Ν_K]Khg٘ƟG>EPEPEPEPEPEPEP\݇HS>~[PݧL9?`&OJ+'Z\jŜ&NW>Ǖ>PCF"ִ{W牾NX>EPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPw=?Qh*?- u/-  ; _[5tQEQEQEQEQEQEQEQEQEW)oh_El2Z^oK`IvkoR.FR[%;G"Zwk=㴐xO[Xoo'sy8/|<\. J/#ﻸ=ֱ4 KNsvD?{{juwc5̑ #!s,sǬi s"ܡX.dTKNsvD?{{j̾$РZӣϑ3 Iqkǵ\ X;T~ hڈ7xTrPfyL!9OsK|A֍~WQΉ ."F'/&x, ҅ɹ<m^nۜϛgS\OtgEiZ^H$1HQ3DYp9LDzOMkMQ "Z77cb8bN1ҕC,\ ;RO b -̒Ug s_ W^xm]o. #O' YΪ0yq՟k<O?yyjo(VuGIbZ\B>8QО%kt]wL0R.πv8y#>sv>j ldI cbO9$gZ6. [,dA%s9 ?MkJM܊#+c0(**=g~${T}8bH5KȫNq}Jdhm/αX3ǭLݑQWv-%;G"Zwk= 4>xuX^#'QVتt|$j_hN3\<>zA4AsmjI2"Zwk=%;Q5u}-F)C;DBXLSL'[?WAu3Z<$"vBTg2f$> -"]b/1̏Z]zļR%;Mƞ]B95[KVUA$F}A]cz6-s{ K9ɷT2ʮ*7.[$v KNsvOOsv~u%؞$wpGTg9Q"ǯg|'kVKiH+O 2;dg+;$]>sv|-b?\|mZKuM?h3J $q i_L_F`Hܷ!~ԛY_l\~3gi{U3NE8 d{?#iu{>En~25mƬʭR yS1//?0r^ڒ_xv#(^'&)qzsך뷶',2Fŵ8#z5!]mLkX* ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (>` FEw=?Qho+lW?WR٫(((((((((KJ`i]%q#Qi3fKBXܓq9Rkr'ڪ6muswon-d8`o!y@ Nx+t-KkKb~/q9ǽn}ſ?q/#QDĿY&՚o{LWzdvi$=>!iZ>lM[%*I<ߛ2z Nkc~-&'%jJoujֶ[t°|S*9grA5omG3/5 Cml}gz_ _F~-&yZdżz}mp+ @W+$6=rj/impLު$ yx+_ _F~-&wx:-_OZ-p$vG'9h87wz)Y^H>,ƨȷ7gמ8h.-ch _ p[^6bXo;灅Rx>h8_ _Fvq669]j3^Cݭ#ʕJ7!`Z9!A+A >O%``xxHIleA$6[ko4OK}ſ?q/#Qwy ƃAue~Ԣfi9PD_jp29sT-\ 2kpPYXX[JdC <y]G[@M54'%jko{ XmRT  @~ :9&;k]iݡdapcћEL7~,.y]_3e$kR E2y_<μoAYן{I5U]7.p2p^nU@m50x7 z{E DBjzcz!^_ͬɪxj6h9oz1o$?X:'=2,QE!EPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPw=?Qh*?- u/-  ; _[5tQEQEQEQEQEQEQEQEQEW7@m+oR.FTa͊(4 ( ( ( < !4O4Hc 00L4L5 0gt5D7.Ԋ(̂(C+Em]=s'WaHڦ{ͺ(,(()M4 aڤ5Tj3R(cS =k 7Wa oWIn+urO+e=QEh@QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE%OT6Z( FE{sa]KKfº]QEQEQEQEQEQEQEQEQE_P4_J+Կh Ѷ2ksb(M(((4O4Hc 00L4L40 < H 5D7.f|,7M}"C+s (cD)[WO\Ɖ!R?"Gsn(K ( ( iSMj6 F,Ԇ4OjaGxsM:'x?9a&[?m\ OrQZQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE|GC?h(zѲ@WR٫WA@Q@Q@Q@Q@Q@Q@Q@Q@Q@sz w6ҺJ/(/mLآ+@((( 00L4L40 < !4O4R f|,7M}3Y ?Mkj=H((+?? GV1HgQۢ+Š((i@CQK5!"50ژj@Q-wIp(I[$Bi|&SܱEVQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@0~PGe;J`lP7@w?Կj+o+lPEPEPEPEPEPEPEPEPEPYχ~MSLhՄMunOAZtP  ҿ]<7@+qEp<7@+  ҿ]wP  ҿ]<7@+qEp<7@+  ҿ]wP  ҿ]<7@+qEp<7@+  ҿ]wP  ҿ]<7@+qEp<7@+  ҿ]wP  ҿ]t6 C 'Q#i@Q@Q@s߂ vfǻvKlG`dt4P  ҿ]<7@+qEp<7@+  ҿ]wP  ҿ]<7@+qEp<7@+  ҿ]wP  ҿ]<7@+qEp<7@+  ҿ]wP  ҿ]<7@+qEq KLF\]tyE.qb ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (>` FEw=?Qho+lW-g4z`4\A$5 ߌ?k?c7@o_wQ ߌ?k?c7@o_wQ ߌ?k?c7@o_wQ ߌ?k?c7@o_wQ ߌ?k?c7@o_wQ ߌ?k?c7@o_wQ ߌ?k?c7@o_wQ ߌ?k?c7@o_wQ ߌ?k?c7@o_wQ ߌ?k?c7@o_wQ ߌ?k?c7@o_wQ ߌ?k?c7@o_wQ ߌ?k?c7@o_wQ ߌ?k?c7@o_wQ ߌ?k?c7@o_wQ ߌ?k?c7@o_wQ ߌ?k?c7@o_wQ ߌ?k?c7@o_wQ ߌ?k?c7@o_wQ ߌ?k?c7@o_wQ ߌ?k?c7@o_wQ ߌ?k?c7@o_wQ ߌ?k?c7@o_wQ ߌ?k?c7@o_wQ ߌ?k?c7@o_wQ ߌ?k?c7@o_wQ ߌ?k?c7@o_wQ ߌ?k?c7@o_wQ ߌ?k?c7@o_wQ ߌ?k?c7@o_wQ ߌ?k?c7@o_wQ ߌ?k?c7@o_wQ ߌ?k?c7@o_wQ ߌ?k?c7@o_wQ ߌ?k?c7@o_wQ ߌ?k?c7@o_wQ ߌ?k?c7@o_wQ ߌ?k?c7@o_wQ ߌ?k?c7@o_wQ ߌ?k?c7@o_wQ ߌ?k?c7@o_wQ ߌ?k?c7@o_wQ ߌ?k?c7@o_wQ ߌ?k?c7@o_wQ ߌ?k?c7@o_wQ ߌ?k?c7@o_wQ ߌ?k?c7@o_wQ ߌ?k?c7@o_wQ ߌ?k?c7@o_wQ ߌ?k?c7@o_wQ ߌ?k?c7@o_wQ ߌ?k?c7@o_wQ ߌ?k?c7@o_wQ ߌ?k?c7@o_wQ ߌ?k?c7@o_wQ ߌ?k?c7@o_wQ ߌ?k?c7@o_wQ ߌ?k?c7@o_wQ ߌ?k?c7@o_wQ ߌ?k?c7@GCKVԵ5 ,S4$$${(PyXB-1.2.6/doc/html/_images/ComponentModel.jpg0000644000175000017500000031464313152762205020450 0ustar pabpab00000000000000JFIFC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?Aloou;ޱwKQ@T(T :U|-A$)6F>ȕAx pN`jq=b"aڢN6'88`K=3SH5#p!54W΄)r8p ֹ=G!_k=z7^][ v/|IUȪvmt jmCI|[4v\m3}[8:xL{WULoWeӭ<1_ugjoz&%=օfo[NifD d*lW oN ݼ2h1 zn'~pRy -Бf3ʒh o9$s_-Z7uAKZ[n&?|n?Zoq ZR :C*2\1lg8 ,i&zsMEBj+Q{ r>RdctyqO_2N hJo*;F?^0WSS Gj";+4+cbryf'$_!_k=ֹ=]ֹ=G!_k=Q@!_k=ֹ=]ֹ=G!_k=Q@!_k=ֹ=]ֹ=G!_k=Q@!_k=ֹ=]ֹ=G!_k=Q@!_k=ֹ=]ֹ=G!_k=Q@!_k=ֹ=]ֹ=G!_k=Q@!_k=ֹ=]ֹ=G!_k=Q@!_k=ֹ=]ֹ=G!_k=Q@!_k=ֹ=]ֹ=G!_k=Q@!_k=ֹ=]ֹ=G!_k=Q@!_k=ֹ=]ֹ=G!_k=Q@!_k=ֹ=]ֹ=G!_k=Q@!_k=ֹ=]ֹ=G!_k=Q@!_k=ֹ=]ֹ=G!_k=Q@!_k=ֹ=]ֹ=G!_k=Q@!_k=ֹ=]ֹ=G!_k=Q@!_k=ֹ=]ֹ=G!_k=Q@!_k=ֹ=]ֹ=G!_k=Q@!_k=ֹ=]ֹ=G!_k=Q@!_k=ֹ=]ֹ=G!_k=Q@!_k=ֹ=]ֹ=G!_k=Q@!_k=ֹ=]ֹ=G!_k=Q@!_k=ֹ=]ֹ=G!_k=Q@!_k=ֹ=]ֹ=G!_k=Q@!_k=ֹ=]ֹ=G!_k=Q@!_k=ֹ=]ֹ=G!_k=Q@!_k=ֹ=]ֹ=G!_k=Q@!_k=ֹ=]ֹ=G!_k=Q@!_k=Rß5m[IԵ{<._ۺdSJAȯP?$](,xnđaiSڍWQ$;M?}x[l?ȴx7@w?Կj(g?oE0 (g?oE0 (g?oE0 (g?oE0 (g?oE0 (g?oE0 (g?oEK?扢LЭ]?yy-g]>:(?G-[#'S'sܟ  (((((((((((((((((((((((((((((((((((((((((((((((((((((((((ow: Huw҈o+lW?WR٫(((((( fsy'kk3'j(%' >/xW_)RRI\I}oWjMtE{ƫVq_?Q >jG8r_?Q >jG8r_?Q >j7@ R};6@BDy‚>r;ROMtE{Ʃ?6?熷;5Q_J7Qȱ>YLh컂 UkOh7֒As?k.,HvM<̞\Hs.m kwj}x_#UDK(㺓2HdhDkL8ld0#9]`!{,Կ;n10v4sʍ/N4Q ƍDXFZhY%hv|r #*J1q3qR>e,*FU]߿N8 /h"4:瞱K5V: V[L{}ȥCdEקfŚeu$5va]lw@]7%4Һoe%IKcN5%TQEjfQE_xVK}KF/nM2Y,S@ !3u¹o "ºMS6ШaAU_?5oJ+>vW*1|kCTcO7$aAMle )Ԗt9Khf[ʾ[7>K&n?7';TtaAM&cCD\^"@9_Hk-eVE4pٔ†^G R- &;l7nGoʀIl#$ިZ+nY&hg2yw3|ؠ`Um/n.M˅bXUi?tsֳnio}.wnlS*3o |TLzu;Ӧ;suBb^aȖu z3u/X|=&K9G19"(!;g=FuLZ#ʤp: vɏ!..#ʦ33M$%ڠ9|nN3[Q+侙"Xԏ)Q<zsM[Vi'gdU223ArrڮyiK4E B%P-Ϙ]= 0ьS]tm2fSW"XwLGm#،W?}૿(oc^_MG;Il9ևTLM-InBiI`Ag1=󊞗[c5 R+` 6>f/ɦ4dq;[M l  G)'ޥh%Ԑ-yA olF$0\぀ 䑥т}Ζ)VxRT0Hb3X]8+>/ZI>˙bqW,@I8+JVN= ൿ еH&ą>ïr}ҵ;\K. f$.gcnd]((((((;A'\կx52Ӭ YKLʹ(S*%WOT4+IgyS812h0 Y%xD%Eȑp 31uA{o&P P-2A$P\ I`x'Ae-|f*f`zmLխ&&I HNA'-1|A&o/`O87y,V{} QYZ80$SH:B~ $qּ~ӢKȠP .2Xzt[gkP<ʱ64/?o|D*N;*YWi@@}>b0sTF&1qY2%@!'$}5R{ؔ-ܰ&F X#=9ҹ{ i^ܗs.gI\SbvS::ig3rNK fĨVFpr!]}qrxWR5Qe9J#|{'|JZ̚]j3očj*:>dIMtOН/H}GsE+ٝOН/H}GsEAfttW9 >Bvl"Ie]\$ ?'N?$QtgGEs?'k(Q;\_EYOН/H}GsEAfttW9 >Bvl"Ie]\$ OJ/O?$Q̂(oe_П/Hw 3JO?$RW}B~l"e,Κ,C\_I m 9p:z+ sYE'%(k)s.fuW/ } :OL.Q?$QΦ1G\V4KYM.mRKUsȽ@MI>ft4QE1Q@Q@Q@Q@y$:DuAWR٫WA@Q@Q@Q@Q@Q@Q@xW_)Rw$Ŀ MZBKFŀ`TbB9QNiFx57p;s:sqfKoU]ZΉ\^EF2Έ8<:5^YIyq([x{8W9难%V Z Lgll6 b9';˗[}1D]#yB$;@* `@{:۫hm!gة(W{ ]W*Yy9s|8[7eY!KmqhI;= *bOj|GEҳ2F[IJZ6e "9RG=Er1V}w=QsFdo3$QZGYVG81܅A8FGPkCjzΖ&n8plEAr2=xng "ٟ'|2 S#F̭c:EdyCmmTx$`zugG-#2ڪ_x(j&yomnDW{*29~.>{aN {?QEtQ@rEu,% ?Y5D*;QEdXQEQEQEQEQEUKbu͵Gqn.;Z^{q˧[qy,#LVvsψ6rOuqjv. Q;6fr[zuM͕1kfxyRҾAlsU%V-ZhA"h+l)/iQ2FL`pxR |`"t-X_I*Ɩx>D9`F9V.fl29.#YZ7hU$~Uy#;z`$1JeW2y\I++,ķ8튉|3F @m#AѩU¸g[pj(Ew'0>n{+Fo?$3?SQM2{qcKg,9;b;\uޥ`ऑ-#Fx#?k"P͕6tFVUNNJg'c33[ b =qWnI=@VÚI?֣U†{~Ki۱iċ+yt07*g&z̎ /q>kF <6={2CikrYPmeDFn۽zAՓ܃+Y]8+JM_"wOTO6|2, 1׫|4= صkb0۰i(nZ?s?͗#C~l ({T\6_G#ڧzz(S=s=j9렢9GOe=ߛ/G?s?͗#C~l ({T\6_G#ڧzz(S=s=j9렢9GOe=ߛ/G?s?͗#C~l ({T\6_HKkL{LWe;7wٻ߿;~^8 ;[76_L<L,VD"gvYIw`Zg-8"2GöٔA_\VwmhxDdAR ' Wm3X+TGʷ˞A)h=Jw5%:~)O,'Nc<S#`8t3ʍryQd@䓼€ɰӉY'W;:B@,p7d)4+d ^~R[G'tǮ]ϋRX􆘅5-3dũJDA &v/lke=8,f,r~VF,$dj:uTtL(LB((((ow: Huw҈o+lW?WR٫((((((O]^]ެsZtĬ9#AdbwM\g'+_oۍv{X٤fJ@tcNž& H979,`wu],smROGƓ[3no:4eApN>}į=6uh]Ws\,FJcDPb:m-ipҭ='#PY#j; &a5_s%ޑ,]H`, Rhi_=0e FAꦡZ_.#"Di?3U\5?AgED#`,ɑy{^ԭi}&@fIR׍ YPf$_Qeuv= y~Q֮[P& F`Q,!s99Y|qiKѭl DcEE)&|b894N{^om޸[YZaDޑ@XAՓ^soQ_OG"Mn͹F 1N k%wgA=r/#PY#hw=SJ*zi|5OxgNn]kX&h*qqZF=j rZG?e:袊0 ( % ?Y5u5xKA_jTw7hȰ((((([/}v|-B/] W. ^FYq/[ipڽZ]HѭQݏA(lMSmkJ[lf.̆:& ܫNGjFkS $Sm$i >X {iձDu  3+x4_y5v$QA,FP\~Z/)ir :Xadʟ&ps H5tx #sE_($qe Q?ǡA6^3s5iKx fl iYʱ@[,Aw.n5MFKky&,Z'[!o"j7007(9'1]D `6k|wh1=sF=r*Dմ/=BK4 2pn+t])] )-0|۔ 00qFETWnn4MNRK0,w$W)MOһCndyFǰ>3vqs#: 2ڭ&|GL;=3nCd-76Yd @U8l)EʌZktC<$K}! zj&&'gO3+ /_YsTtpZv:&*KX=yvcޞ7۠conY5HCք6.߼ rm-8#[x-@xFۂGsCcn릮f?(zmLw6(((((1jFQ˂2ZG#: &9[]xtR$Lyca 9f?tk{b_S q(ll`G*O݆$E$QFƊvM;}bŶo>$f{+@DVS|ۆ{K~iL0/1$(H.@1覚hNhU\ȾX DT} q!m~רYieÒJ6ġv)?A>z) Q<H+n@.pO ,pZ$ԖVMxr3.7d/\K зqn@V("pFLmdG|i࣓s2jqQ !̐ ¦N7 s[4*K8 u6ZUY5Ԇ|򠳀{ r1$Q"(UE @aA8פ{k wp3$R;lOLGlUCCe̻m sZG?eU7Dh(LB((((ow: Huw҈o+lW?WR٫(((((( k>vg6 p On_=&\d&9j({;%$i?J&'tIQgIO_6I@-+=z">fy?OG:?OGEH3<$?ҿk'#sć`W dz(qSxJU@կ[K+Xg.fv=L^Pɰ* ( % ?Y5u5xKA_jTw7hȰ((/Ga%nBke7e,N :攷+D߳<ʲrPc~ȃ^8dqwv=y'ҙwP=FM>'tUTrZQ cOYMoK{Ųе[2Bc9)ꎧ3Ogmjq; w y6]ׂ5.d̲Й&I].D=1ҭ @0Jg?܅>T6fMF ϟ7ޓLc+"L+c[o4mVy Y ui5TV,0vT;g f_0[Cs.Z)^Ƞ9 qܶ`η̧SԵ{|Td@]9$ekfmO|b;{(+3#]`]r2:Rg{9y&^,c $n1sb{Fu+_1 "cyߴL[1M4Խtcc۬$68cVn<5$]/Q$bb8w94Mɽ$0pG27b999[-#apUz4z Q]A\9 VW?x±tQEQEQEQEQEQEQEQEQE%WUsHѾ!_ںYyjH[qG*eX?xKTq/tOEV647N<%CN?8 :' "⨰V'D_UxKTX + Ӣ/*N<%CN, DŽi?aG'D_UzOϭx\m-j6tqkM+Ÿ⮫ Ӣ/*N<%CNj[XnC7uam%]sn1Ό4[9TæV7O-@@}޳6t5xKT Ѣ/*Ӡަ5 haM4hSf;4g>/*Ÿ3Jw64!?g>/*|kOo.miSO ͣ|_U4¿3hJwFѦ>3 7R[]YѴkr?y-񟅿e:/*5/WYZ}ߙiMN3i"f=b(((((?$](ow:< ; _[5t7@w?Կj((((((((((((( ]Ѧ]2KJI$I'yEsx?M4 4?CAEsx?M4 4?CAEsx?M4 4?CAEsx?M4 4?Ci%6񌼳8EQOw&ͷ3)3S^y֒[K}% Ch82Gk|a;@^wiNb`=Shǯ]۠sI񾩨l{nabZ&ޙMahKiڍVn$Lnm8xD*;DĿG[@M5eb+~-&'%j,DĿG[@M5:֥Ky CsZ ٝ2`0xKP,oh8oZZ_m#|$}aOM ##Fzam<65{v+; "Ocɭ_'%j>h8]52o1qw;kŷqikbẃn'Ud9ʬd:31>x{O]WQ6BT@bm;$wqd29'%jO'%jwe|ǵMqewꖐ]Cs4֓N]oPuvMTO_[I 5\A)y&,yrI'W;Bn[@M5'[@M5+yVjm󢿋?g> |= Y5Uűns8znY@M5!gt_Ե}oj`Z|<[X緷  Y|û9GL;I9$_ _F7~+.yljC{H`ݻˍSv1 T ߊ _FFRՒ64!WoKԆ_ѿm/#RmiSuh6?m/#Ұ\5o#x? ez৺kM{ 0@oL?!;ZR^( sşHkgc+Z(((((((((+J`w]5s1Ccng㹵EV&EPEPEPEPEPA@ 4N4HcM!4 =izM!4N4@ƚiiM4Ӎ4gG-#2ںs\Ƴ#`mWOD=.(((((?$](ow:< ; _[5t7@w?Կj(((((((((((((O<5`_W?O'UZ(((((+.+d-/]WQɪ'Qݢ+"Š(((((ii4N4HZCHc !44N4Hii1-#apV? @EWAW?x±t{C,Ek@Q@Q@Q@Q@Q@Q@Q@Q@Q@s߇. m7X,odݣuGvR|yЎ@'dݏ^-'ĺɭh_ u #s%[g? Ad;_5kƙiD+20{q5_ckkwN.?!:̬vp=_ndg 5_cho 5E]'dݏſ2jwEAvp>-Uv?fɪ߻3]YZϋ4|EO}/fHvY؅D@Zbokֶo.|hdYJV^/#VSovgd9\Ý fc/3ZN3oj[ȗQPM]]M &gc/3I犿c/3[ {!k=H.l'P$xtWmʱ=Ė V.҈232W zei?O ZekB_G=SiZM8s(1**>i-zddu[_b,C^7k1ZEHe1;u :ʻ3OFSC|YOF|QC|Y'ĝ;M],H$ E3F.Nʮ[9 kVCUr$:!r0YTryo|AkE Ulx? :ejPxQ5;-Z[xh7hbdJ){=ֈ^>Vx]qK="'U,$SXxcuUW([Z.O׮kd/`m\ɷ{Jj+t`)((((+6!J#@?$](:º]s u/- ((((((((((((+' *E-tI熿k: ( ( ( ( ( % ?Y5u57tݞY lҳ'99>2Wv7(Og:)-.OIhLyq ew'֡wc(>E}k<@]66܌v\!II0i *I# #*դ'7 5͏1o9pq\lƝΤMrKh%9A/Cg dBV2Z|%l:3Gs5?V?_G [D|_M+恤5~E-Q̎0BJÁЂA"¬GTߨmioU^?N(\ώ0 <1|O4\ºiZX%Cir3:qW?VxozW 4a[GmwH?<7@+־-e6 oob(-5f#Oʪ])XhЀgc+Z+Niu#8ebU_Q;\_G$ e9'=88|9Q >Bvl"Iev"Oԧ츎4>_#sǜ d)IT4E,Rϖ2j]OQ*FNiv5?'N?$Q >Bvl".c֤Ǻ;+NUTRD- <8%Qtd$LНȫ6SKu>3,sW}CsE'%'*&֭&:=U#żDqvbYtC ]B@D` PFW;T_sEП/HkXYI>cwa*ʐԶ!qv/ zcƞ=Xӵ x.1n;97?,C\_I u 䊇HԮ56imx f+L)nndxUڌ9<4hY9S#"F%()?0G\YM*5AD93N Sc&׋X􆘅5-3dϵ~+\6%р2+9z޺JU^2M6=p^קVmLݯU-cJ4{.7]DH;uT#珃 .l>!jzYM SDIa.X,&+oG TqӎmQ@mCŬpc܍cu;w`*V݉{RKո35ܒ4Jß,;2@x$ E`sZ6Z-mƃ~Bm-u;/~jg,z}}+/?d+(;ƞTծaզV+ۭ>\kn%PcrPy▴R4Jb V?Sc((]EP{sO[O:为DV2dkk)PW$#b*}l%kd؏&!A i\sY>&{Z+/5lc}EEtMws! 8>_AxM!I4KHocUvϕ8Pru3.nE((+6!J#@?$](:º]s u/- (((((((*KY( C1,55ٿ\Gj+wʀJPXcO"ڦYY^q["xecv{޻(Z_0xWW ,$k\\I: cxqIċҠiLҩڑ%|ݸvnF#9iyH0Oe)징PBIDng>-fxk˦C $sӲ wPd]&=V i2z"Dp=Ȯ,2\FYB5 V#?[@^_^5q"YDOʻ@:{֥PEPEPEPEPEP\HQ6P,Թq]s2hw|0η ֜208e1=;+'GY\[4e w !+ ]H5֖(V&grbtȐۘq&f' ?|[AUBJ+_kڎO\ne.kxd];v~kqow BWL dY>*o j^>gd˶G4=T?Mپ-i*trx V]e('DkpO[H ǡ~%Z]7ſ?M/%T.YjڞZu[Z4 JÆ${)nEd/Z6Af#8y#z)̛Ċt 4aqjmi%OF,TC뫅tyi.t/@s"j2NGڙ+;Q鶩}"KxDVqМ՚(xBdk7s\ש'[l~r6ySC UΖK sOnfFRDAPzJNs &%{V*Ykdi 9tԕn<2lK1qy靼dKN$w5Ӟ /cDܬB^xpI _پ-i*x].m} HH6 >z*3Gk̯p<,|BܵcԆ$?6Čr4vkX^KKt F.|`GeoLbh|U<),^ О7PC#*&qwj9nt_]m.`B$Àb@1^\χC+oKkXuK7o*T@3WK@<߈{SNDfs#Z:RY~/4뻏^$NL3ZqQIk w1\% Qy#"jd8 w;IKY^Gky4 KFH'jע'ZA6rwy.z}Ttt{{.GwYI.1E ٤bBHZ/h%2˳2Iy3ʻP,ˠS @u4|-AnB摘pʼncxA\֏㻵k*^!٧i,7rn r<{>o/Y]\@"Ey!\9Rgyp/KuA v,Ga8fSFYgұ~UedM͹)lGk1%|ko $iUo /~ЅΟŷnxݚo/NҵXb-$Hcs n0#i7uѿy:yc$Q3K̰260OZ6Yy[QܙbĜO=Taa}⫏R(IR<$~`@pjueu9ҵk7x}BѝpK1pH<;n\n՝A1d$zO@:VɨM;\o酃v, e&W%X$N mN1M?_?9I9Zi\'4uQuZG?ez]tQ ( ' i_D|_MtqX'(`?"?p?4i<<3F9V% Bz֝zrj0]-Λs!*FK`:y5s:m̦9`8},82F UXUr6x=CNOX/& #;xgE $.\xP:M9iX ?vdթ1# zS.+8挊$J9f`8^䊯uK>-fKfIg[F^Xq, i'Eش8APbE?1s s֖5[[Գ>Ѿ񴪟@';qՅJ|_toYkH ha VHG*apF*} X<%f^A~fҔt@8I/|sD3-hQ'|)#ȋ$knӑA8Wsdg#5sW՝-K0tÅb*+Dq}^w8iI;ؙ&a6*dsrxK’<ҁ9x%pG=FFr:T3:]#KiœȷXÁ%3? [{|g%^ʪ3p*}BC9˴ϮSSٞEWIQEV'5E#B#+ZYrs#>5P^7WQm#hCѕ|AP<[o8i/C M}ǩi+w0Ȯ`5I_ aIaĐ YPGlJ((?(z?mtCan((7mXt҉c-xp_Z'5+?XX]T>`#~ mZmw ܇i4D>c ^\Ï '<e2vλaV#_ u%Y0EesM8 8I*Vo}s{ Uq{ɡ Au;sc}w&m7Wש{ti$Ј36.@Y_Ny6Cym iLL{.X/s٫WC]m}@^$J Czv_\f;[5eVgK.@$0wgq%4M>K((į P$hX(c=jW?x±t{C,Ek@΂(WO7`_\7=Bo'QvXЪttMm?ߛ/GE`?ߛ/GO o= 7Ddu 0FAC~lG?5eXC[lRHԮѬd٘“"7AXbfq#;71llxOG?5e?ߛ/G* n!6v]ʱ?ɳ-md9W;@XD"k y}tC ߾iza5/g] KEҵ}gm,s&]Hۜ*3PH 5t KkY=0: z4m1u/ug)AԿm՟hfɦ:Cf~0Z 2#`m^^Oqcqe-7>oRى-yq\AӚQEY'?x±t{C,Ek]QEQEQEs!+']WA\9? WUPEPX>7mziw'!5oW?'"noF"EP)Q@Q@Q@Q@9? WUW?xO²tQEQEQEQEQEQEWmCۿG^^InQt u/-  ; _[5tQEQEQEW3=_V?6jc*Fasj(M((((+*_趝K:I=e@j=gdw+H37*-G-wqi]O\:)_0Gp۾`n #їuگY'}th-}} 8º4-pd2Fpx 8SVPivѵŭ"}yqn㹥/97-4ԧ츎4>_#sǜ d+f:]ܥ,#ﵼ%seu$zI6}f+Y3+ipwd*-N+260 -d%sE7~FEjƤ-7O ,xTvSF o+qwvo,LbNjiZz>amhywV8v%ׂI8nԧy[;MR[Ѣyd0pK;z1VcY7C4z}0<0ԎHoK T+kt;F1W>կ2}KLo ]LjIe$.Fw4pVEg*O-bVZY~ɦƪlF&]dJBq0ZWvtW~+s/o oc/o :(`g|lM<~5?o?^E>fyz/'`5'o"X#OKHV=:(Dp){C,Ek]s?+ZA@Q@Q@Q@9? WUW?xO²tQEW?uIȗD`(((((<'aY? C! VO" ( ( ( ( ( ( Huw҈+6!J#WA\sa]KKf ( ( ( c*FM\PXۺ8mQEQEQEQEQEQEPhx'{ռTwJbΖq0ϽrKkyi-iK?/WMhkv}nv>\hH9d((D`ʠ@@5zM G4R2t0=Ce֮QH` `dbE@v++l4QEQEQEW?x±t{C,Ek@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@9 VW?x±tQEQEQECEu]s!+']WA@Q@s7Fy_UW?_޸_xtQEQEQEQEs!+']WA\9? WUPEPEPEPEPEPEP^InQzy$:Dtx7@w?Կj+o+lPEPEPEP\PXۺ髙J`wS=ͪ(4 ( ( ( Շu ino" 3HFGZtRjNɣxD/O['m/}`#|BORyΗ:qX{@%a2KO{QV}-X_sO,.mu+kt:5-0 y\Hdr*<~ֵ?jZ=p`P>$g0Lkը4JW?4\b8]I$|ċ`M޲(#gCQQj=)`Ҽ95\YH;(+l~MçϨi|A+inyck4: %!7 my_NzvOBclu@ǥhCICOZiPPM4M4 iq@4M8M!kr?y-5k?9iіt$L袊0 ( (9?(z?mtCan렠((?(z?mtCan((_A\ma]7Ka((ºo]s2t-: ( ( ( =!V?"sşHh(((((((((((TYi0Yy;^wb~Am8*xKL5Ҡ!.m$掟7UbI{BꀛH0Us ~4|ci-΍b…ݾNf5 lY8`yfb|#[x&]+E[EG$"o#B+Kß SDk'IKșiF${j΅s| %Z)K NJ;`cS e""=N)ſKmb/G."\}Y<l1#!xa ;j>,:֝  ҿ]tu-NR{#i|iR¬GG* /JtuQ@?* /Jtt¬G]¬GX/}URia[mA"U6>˓'ֽBsşHhg:eIf3X[Z˰hWʺ((((*FA\=gV6 ((+*FA\=gV6: ( ( e ;o [ t@v((++l5W?/WMh(((gc+Z+e -VY;2 uJȑj/F #3ɫ?]#I,!l` 9T״YoY"6+} 楠jW}CNY؉b0>"!mQ.O4-t:`Y I=T5[joۨYhUSdGIwX8q`W$>ne%JYm'^Fqh~((?d++<'aY? (+_+/otb((((?d++׊t> djM/!XC72һ((((((+6!J#@?$](:º]s u/- ((((((((((((w$Ŀ M]s;y_]覮 ( ( ( =!V?"sşHh((((*FA\=gV6 ((+*FA\=gV6: ( ( e ;o [ t@v((++l5W?/WMh(((gc+Z+Bvl"֯5XCsnCGQ)4JG$ ?'N?$V<|Q;\_G$ עvQ;\_G$ תm:fI`C.RQ;\_G$ |x/4 JKHtI;< &maZ>:cjr!)D;mĎQC ʞw}OeП/H7^/7m[ƳyW8G;ĬYW/})隖7]FHhI͍gr2cLR0z!s9R6+?\_H|W{_\Jb/mqr<(g"6/n<}ѐ#\jV7^/JX6@Pl!e{Xֱ=lcIm3oR3Kxzo } 䊩v9[ lX*vc2MTv{KpD`0\Ok!#[ ug^ǯ^xW\&Whv>Oex8Q'6%>NLF%`FX}0CU wW?.쥃N^ çbsGÒ'Xt![QECEuK]wOMȚI.OP!``'9? WUPxVѡTk:%O*5Raaa[ir )[k!%v{测ͷyXZF,V@''8֊K`{jRY1.b{%xܤn,w ӽVћT^ǫ}Gie|{b++j/ȴضz$`2 y`,}cL:ڌv>qkMEh$fEmy7 nx.6#qyx&-%J$,NYvlPA'l Ҵ]>vm=p>jWI2xΡ;Ze>Ah~nY<:;QGKQEQEW_RHUx`(O$Rk(Ş3k;?dA\׋|b{skIt}xQ- 8>6}ϥ}ѭb Y$ƀ5h(((((+6!J#@?$](:º]s u/- (((((((((((('ßk\Q({RZ<x|_+ f- r>Wߴ=Ω'mVlr7of1Uk vsI g<>_Z(((sşHkgc+Z((((? ѷuW?g%YU ( ( ? ѷuW?g%YU((ºo]s2t-: ( ( e ;o [ t@v(((ꚔZN-HLi+wd\; iWW7ڔ3ܸy˪\U+ڪ3²~"zvaZ$Wh[*ߘ.K` :o\CI=Zhv >7K]Qn?ZoQ3^uu-$G#")PO+2K& ȡq,)mg%FlB: gUmpV{=EnQƄ-n1jݜ7 "Ķ,m]̲l y'!\nŠq]Ag\4{Z`?m3;@*;CkhHF5c~=\֥i& ژ,Mo&̭XH^1\(.8]=ă!vb` z#o hE"dGSu)T7b<6[Q+00w7n^nNO5Ϩk 5޺ {"ȞQX%Y*so}+ˢ @lbBAعB.@敂cLZ!{#˿Tg:Ui<1j;%wq+g  麇5[eFo6dbKhh]㖗/C\kzlwzk5܋$XFeY܎D[~[; ٭ +8jGT۶d \gq#! ㎇Gkim z$.dwe /:X1/Mݲ,*fHv |MNu1d]F`*H-≢M\X\<$"Nt7Xo⹗0 ?y9$ݾQ_o}{uxX̱Oqh[6mA\w(K.z'u?VcoASlWQQECEu]s!+']WA@Q@ux^džyMy$&gcI+I[Km4xIkLA%B? ' kzW Э/&A%BެK[ҤH"rp6|14\,cj>.s_xwC9%XPfrpxs Э/&6ũCv1F%ҬoS6px-[Xk{z'kQXG@O^CP_+h/xGMRxkEN#_p'D_ƛ}2MEk;hg&1xRHa9 uA૴-D頎1 Q1VzP k x6֊αK9f yO?X/&WqG嶔 u(AbeV YÐuxdl/DYXD{z86X2C09🃦xފg}?[_A6W>Eƒ mi+923bG’<A9x%pG=FFr:UlLɗbfWa6*ds_x(j&yomnDW{*29V'Oώtt.ѦoO"cgf>P(|23뇵[QV ((?$](ow:< ; _[5t7@w?Կj(yk fTɕwH7`b*pGo "ºMS'd4XI}oWjMtE{ƫVrLMtE{ƨI}oWjh9LMtE{ƨI}oWjh9LMtE{ƨI}oWjh9LMtE{ƨI}oWjh9LMtE{ƨI}oWjh9LMtE{ƨI}oWji(ekϾ+5G&GֿG{ƫLMч! <5?7?熵;5Z&GHtcu`%P`c,ycx=B&?ֿG{ƨG:dc%\dTpc:)>\!m#2]D,g3e>1#y{G| ƍå?³Hd+35$ĒskbMmemynHo*%r:0"xBkU7.;tJіE;13 ((((0L$wvI=ŅiHY#@䒅=녟C-ๆ=6Y efI.4+ńĩtcm#֪)`WmPJ68$gКw z֦ΐ @6!FL8U G40BJdIcO\kA'ucm]sn1Ό<Ѹٷq҈Z \Z%0m ,B.v@NΗs}@ĻnlnyvX ~|VBzTg3|5|hYW'wON)xWG-wu Kq$*r걳PH KRꚾq,{!eUE,J2/;k[i#]UFO.XD ܊iɕ1Sqh%2˳2Iy3ʻP,ˠS @u4|-AnB摘pʼncxAF(mjA2i-ܥR<[IO Xi/eD);D dA~~V qfH|zӺ ;{uE#@Eu 0`Xg3),iXͿ*2&#4;S.ǶROXJ+ou-n\|]~f^@1lnV)-4B9/'˄;d?svG#"/amhywVr8v%ׂI8ӉYgY.7yΠcT')+]_aBx8t3ʍryQd@䓼€ɥu䵹%!!m|hr~bpx:0cnŁ,/*L4|i_oxWm| -`[]ž,σ ,iF;<{Wlk#?)Vkc ج :O9Š(?d++<'aY? (|$ K[Ճ']ZޮvjQEr74bS-YUf6a0: fx_^;t,?}; f ˡ@Oz &T>s$`1VC<ֳ#W6ʎy*Іݐwd|D *45(-eDOc2_Xr*Ko4z9r/ 8ǿhMf;n۷tKDNvGa83K09K/kzΟHt/nYfmV8pFÓzpM\ý.e-95 uу` d$ v֛ Y[ksBWу21"4;x&-:5kDF[WU?O (((?$](ow:< ; _[5t7@w?Կj([_WS\ua]GK&Gsv( ( ( ( ( (tt.-f5fq@ޟ]RTFA)ݪbMg`s3[]=-,iIPgǭ`]mc[%fK9@:D]-n 3ک 3 ʍ$?'_nI4^'é'I#3Y!$uqOriX]gT7qn;} P[n` t7w HU@H ('ӵKMVեoh^F8dppAr=따`}mwG%-k&CfGl=۽f-dT2IpTd35G[y,2:8g'cN;C֚}J>di7v* H?0敕p;Hk,3۴&\ M%ʬr|W*ǀ)ҕ0ZX?0br#Z3Y^ \&`Y {V%jV:B#1cڰ.n%Ӿs &qL7Ts遀kN=Vt6a:]pFsߥNڭ}1J’pt(>@ ,&ӽm41,-Hzz? R@i[)lr'FF :XYIP8WP:lU }cx[GmwH:j+mhnV$C.dXq d &65 r޼?c'JVN=Jh9hg?oE̎sşHi-VZ6/VA82.CD%K~ejICiCgj0yf t@s7" C@s7" C@s7" C@2iD(Գ rI'/xZfZYui ѴTQgҲ? Q\a2C@ƅ{ _Rb}14.%m:rxZfZ>h9hxZfZ>h9hxZfZ>h9hviD(Գ rI'kBV񆯩Y d}>Hu`9\z?.M$\7621,ZVG+l0Arp1H>h9hxZfZ>h9hxZfZ>h9hSŚٴ[g{Dj6FnBT*ĺ܅PI©<ҏxZfZ>h9h[Ol[5Ib@t=8 VnL,ɣhnnj҄YNrYy90: +g?oE0: +g?oE0: +g?oE0: +g?oE0: +g?oE0: +g?oE06/o`Ӭ仹.!#ipzSl5+V\p]@xC uϦGzg?oEcIsk'xKKm~h'mdtPI S¯w5^aj^3S_4\ݻ<;JFqcN z}e=ˎETQEQE 00L4L5#ii mj5?A`۟-áxoASlV?'u?VvEP?xO²tCEu]QEy׃=Bo'QvXЪttMm?ߛ/GO7`_X6j`?ߛ/GO o=oQJ`?ߛ/GO o=oQES[6_G#zޢ|?ߛ/GR[V] .>t KkY=0: z 0iu/ug)AԿm՟fct-GgYaе5i+| +qcqe-7>oRى-yq\AӚMgG-#2ڽ.i({QVHQEQEWmCۿG^^InQt u/-  ; _[5tW-/]WQɫ[_TObEVEQ@Q@Q@Q@Q@%-%4M8Knqooq@.;ZC3ӂYnn{kY/Lgzr$v! &_Ÿ#z#hr-ޮ\*yJ* (((() -!aa1ijF0 < !5?A`۟ռk#?)[C ج :O9Š(?d++<'aY? ([|9#HKas$?A늻 +kݧKh&m2 3ңWt8nFG'lӛ&X.`r !].N9lVgZ _k(n($` {rs&2ctny֯3 M[ư|g"??st: :O خÜ(C! VO"sH*^HpDQm)Aca:kKmʡY ,m kxATm-1Y%ʼn+Ҁl.wHFHꑠ,@I C ACG4qYkR\%j&f#3 T Z@ {}3P&ΞY@dBy`*n ,ė-vi]x%]\K!ecEc8W{/O4?MWןjO4?MWןjblk[],X)ItrKknA13"<I5!m_mͨbٻN3g[g:'u_iƋWjo] _KY%`MS0o6Qc2OaNW.mFI hOT[?zXc#/} '&7u_mӿw ՖWԧ Y%bP1ag5k>6ѿRksU=ii-M5 WjH{5S.ú74 <_C-'y'Tr˰k;kG0Iz .7jp_o̢%'kqXtZRM=HMEVAXzCxDI4xKu##nW9s-F2?Ky3.q(?j:iZ@ ^X%M变cc_Lt՛L>[i,;y$ .w3GkEq4*Iy1\Epţ8Ǘhn==t_4^lp2|ÃgEqV.ŗ&kZKk_6XH8'$kx˴k:wdUdY$\ .N8hZG}Eq?j=W1/h,,7VXp2 2uS+2/l,L`Oϯ+{Ж ZE $I -`B@e$v=kr+j;t{[kmc@LfJ;13ՈoK5f֮ncPݬ$ZeQ_rn 77\V㻽B: J!j&*HP cj$ *ٻ:\(*w7* KyܴE nc V%x!2)Sg4[Dݤ2CJ aFWt? ZE $I -`B@e$v=k7ivWI`[velEkcPy4(ɵ BYPy?.0NM먬SƏo}Q:)|#CU UOC(ºo]s2t-: ( ( e ;o [ t@v((((((((|_#[\v 7mMV5fQwSU5Ƴ4j\Sv9O4?MWןjO4?MWןjM;}?4ir!3CMyƨCMyƫӿoN}ƎD<5_^?<5_^4hӿo39O4?MWןjCMyƫӿoN}ƎDώOMWj|swU=N}ƏM;}^;9s} 4F{5]W&>ؚw4{4>vrGƺ?5_iWjM;}?4i{$OVOKaxWXd(&nvBɏ޽#N}ƏM;}=ht![ 6MN2O?MZQEs!+']WA\9? WUPEPEPEPEPEP?x±t{C,Ek]QEQEQEQEQEQEQEנWmCۿG@sa]KKfº]^g#߳;~b1ҬQ@ؚw4biօϿ>G&>hQ@ؚw4biօϿ>G&>hQ@ؚw4biօϿ>G&>hQ@ؚw4biօϿ>G&>hQ@ؚw4biօϿ>G&>hQ@ؚw4biօϿ>G&>hQ@ؚw4biօϿ>RAY[L^q>޵r(+65[f[eEn;RHqO| *=!V?" /_a:[YBk8hǩ }in<3̷4kyh.mDE=rsZP_#:i4߰EW٢$DEZ8 J[Y!HxWdM)E[ @n$h ۯh1y7iMlfy':.uC2Wf='÷!}%7Į yMgd~LdKv:l5MOMbE9=j=gV6 ʇ]$:ݍ*0VF7Pn-*qf?ROzԢ3дmZ-*;v%1F1tAѴaQ4qj 8a^Mi@͠h=4JClClUFM7Po&X-">djy& HXr}K{s\=gV66mmc(-]Dh ( e ;o [ t@v((++l5W?/WMh((.Y>miݥTQ*s{ݢ/O7%QZ 䪞t>VtW3Z <kC0O7$nt?M4O?1oIӪ (9sH?d+((((((ۛWQ ~(.J`w]sPXۺ{]GHEуE$o7b(CGՠ{mq$-F'9COiWfi_?:ŚN մ.$[#IeT`ca~"ׇS-cEkmr&c/aD8=x9sM4]y5[]~Bciu␙"܏,3J<-m?7?- a3K @0#Ev+[-Jxl'IvS@J$˞~Oc\,u[[=0YfSr"8Ĝ|Px{k[ci%bB*ncxHK)I-ͼp/O=t|O}8jwi=FMx2FO= ɯ}1\\γE;1$2. X:UNC^?; z aL]?d++.¶^N$w#$)' gWi@Š(((((gc+Z+{| ;~O0LfYI[^km 654@.|Ec.aUlON[u۞*xVoEy&;q3ݏ®W)h8?S@ 5>VuW%h8? O4KsǸr~J`wQ^%tR&Ƚ3 D" ~,? ѷuIܓ((_A\ma]7Ka(((((_Ÿ#_Ÿ#ע+@(((((Ķ׏k$[i17Nu?Kqn2M}!+Mюv :(TC>?Kh&$ى39/Ÿnw'82I>0gI!ު@d2;(z/ J4N ks< Ikghm똒 IdɔB *A<Q+~N-'lk.>ԬZw7n< /u95m$·gҮ@ӸD6rN)7W*G;bD`[G;ɘ,x;g⫧.m4ȴ;d7Alj!坘 3/.얂Y>x兌 H|7f,[.KԞ1Gd,@f;b<#2Myw K}.xHrygi;8Ygw{ظ>~ Z⨢nЈIųF#2ys#Z ޚu-{Xd1IԎG*G^FekK_1K[9-VZob#eS-\ʜ^N1V6/ ]1cRYpggP#Opr:trW2C=ZjM-M€\gP6 07ikm=2Gy8t7au8V ]]?ȕk]tXa{m~"͵DDX*+<)oKl- ,ޥrUp9ݳo#l}oĶ%ݽw2LFE!uA'`jQEtζdRѩtFp7d0]u~uDŽd8/#6]rĮd)Rr2wO<Ūi)MRxbmbDB#^ŴϾz֝c'.SHT!Axˀ4Hj}{gMR'r yFe8upv#v A{8,aiƖ OI06RLz':B }rđ[r=]i::oo`>Vt.FXZ mfHWVbtlc\+RXg *J #ÎEIYƏZk\4P*ҳ.((((((‘Bn属qV-\]]I,wg-,0lB*yA M5_#hc1!<+(S,ķHU>4+߳q~t2=+ҧ^.ym|d>r/mbP lih zHt&TWidp<#CN&簸J[xrF1'9Jr{K"EIjF+<g pzFg%[UJD~kGl-(%*dRT 9A5;DXCw#L@}]aQs Kyvz˧]/3«[ nhQTp,q"2+ r\kQ$Ev(#*3840ҒTid\oQҨ"30L&JrUD .mוJ`w\ͷ5YCan 2AEUQE@v++l4QEQEQEQEQEW9 S¯w59 S¯w4[QE`hQEQEQEQEKRѴf4Tl3[PvjW1[Wc >d?,2g-tWSO(̉)gxpBNz &Z^"ӂ->6ܓXq] V9q|޹iK۫x[LwB䟖A6&QI6ܠ'p$0 ϱ}SotemK13%J-YC죆`Jȯ318u<=V-nǚrK$NZb0-!o(QQ܏\^{[i/mKg wt<5Hof>sǘcVtbcd'H5h wPI $2 [FxHUΊ"P堶Hݰ (0PuH(Z S΋8RÜ$]t45:/5p*I;{X&8錂3K=K\uj6@KԑwyTa/.."aKh‹}V/v9;}ޕW&î/kیnN6J=D</օgЮ(((((((Xr68 (l·cWIi${NO6qc0ضq^V?:k?(z?ms6Rn?G\Mg%YU|([QTHQEW?/WMk_AEPEPEPEPX*RΡq\Cou XT x;5^k(,e}BH##dဌps9=s@ӳԚ2Z5'O! U%*ȥ*FA1\/O ҖQV5袊((((((˓,!P|KN㌶{6adZ[x`It1I&<8P;|N՛/ "f}/"2oFF`p~a=hԛR]6_޺/x/J-\KbEx|rz.vZ#UjO^"F^ypy-I`c`hB#<01MB`%Fkh㉮%kg #>`wvҺ'bizڛd&1Onc>i_;2<; SQ^OYxv8vi0#/p1x/wyek%`13壍ʁ@lgіIE{0L yuޓcpV[dqzqtP7f()QLFWb69#9̚>k x"`>c 79{ҷ9kb`'>}gQ1ҥD,sFu8 IR;'PӖ \ǕtX)V?57b-]K>cP LaXq8#FݶIɛQp"(T|GHm4lVmȉAM`3 ^csמ%ʒ+Pf,{a }cPQ(&V)WPuxgn*Fؔci%{vǦMb1ju+'!XI$iūWЬ@#Z`QEQEQEQEQEQEQEs?+ZA\9 VPEPEPEPEPEPEPEP^InQzy$:Dtx7@w?Կj+o+lPEPEPEPEPEPEPEPEPEPEP1Hn4O‘m2lQEHŠ(((( { X\=ԓFmG]"g@{t$M?S 9 O#=E6Ķ׏k$[i17NuuYXt=_,]dcuf/ӣG4)K^Fdc;ܳn3e>ڽCkV]Eefi ۷yk_Wv=^iT]Ԓn#I݌*)'7OC\~Yk;='BxcۤK>q-+4os+]VZ;($me=8 u;¨>/x+W|KIY$դEv*THJxCR q3BvȲ VkIԭ4-6H϶AJxCwҼGi[NFugԱf|LXGR W9Ve, WB @B9ScfR̿:98=q\՟-l쨉"oߐ cedbTqs6d%{ᶊ)/+.WK6Qd6Rn?G\Mg%YUfJMyX? ѷus* ( mքejS{gqFȬR0ʮvEnQ@$: ?!?L?$WAEs&k(T3\_]CЙ/HSsYEtP? Bf"HuO5eQ@$: l,m a B>]Wk9#Kk$~\}zPq \r],+{z}'LovCxu'h4 ?dT+$ÃȮ2\O])ܲ_uC#S>\xvSAk3[i'dSkpKcs(;Oaͪ+CMyƨCMyƫ3KO4?MWןjO4?MWןj0:Z+CMyƨCMyƨ i/$m' H8<}j'k5QO][oq42)I#Deu=A,IjI;!-~Cdq6qjKbT̊ C5 Q9d0*56y=3֣ww-#yjC,q@xn!w j$7ۿ>Oz㊂Z=ȶ4,,"u9V8 4Mw!0,^EiI d&<0wN<D!ˁ1?{ 5W}Ȭ.cӭ`M*-FiJl@mq: 篏mFOMΪwI, 2|ȕ>x9 Ү!T#3cm_|uksekk..eR8S$Fw2 #pzZ]_AsxFoZ }I5 54R&fdr6}J#@$1#uٸs qVyc$VH$'5mdH ͻPRAl˱$y&v_#.j7/ oJBYYcHr˭|X$M:Ȓ8$X5!nޮ hi<̒FU(!˄RPvVHv ВD|BztNz:ū[4ř#mf;kgw%z~7,̈#<}x1ZK֬V;]?RӢ!kfPp7wOty"+]݇|wwC5+Y;y2[(dG?1I$gp(/@PiQ&Ip6#4&ݕ* BI'M iEWo" :#4u5YCan뙶q^V?:k?(z?mtF2(B(()"2:FeaG Sz]T8`$״hE]~pP9LnsT6qhV]SqF:L7s5߂/na63rfYgiQC-b 0 _~;DkacOwvqlϮi1[>d(khNAW;sm/PQg%+j xF]|; Uy~Sė1eŸX@W.ޡKV.,k-dG 7 sqҏKOjvĦvm$Ǘ+t, 8鞕snmd-m?NAbaG`-[qjOm1:^RV@;H1҈l\$MVŧcZ9_ƣ<0Zuijvoҹv5$"O;EX1kuh&~}]>p>oJZrxB59d- }Sm I7KYn[Y7l;O^2iY5H,."8S"Wg-+2^#/qGFzu[蹹]SME{x5W''#FlM?mgt.N Kбboª5iT{݋y--o$d1,~ak lY[IRE`KFH>  ke3٩{<4֫,;v6`{RۙmNd#KTK=!GC' ^x:KhctǂY|^_֯&>ck^R{]IlYV#H" *uۜ0eؚw5EgbiϿ>ZP&>`G># .rn뮮OG&>hQ@ؚw5=ٙ58F̲1 9@Z+SiFeӧKء31TZx^LQ*jԤb'^4coϿ>\st7IJ< UüઃٝOj`Z[ؚw4biօB34hӿo (?N}ƏM;}Т34hӿo (8 %ڋg>%PEPEPEPEPEPEPEP?x±t{C,Ek]QEQEQEQEQEQEQEנWmCۿG@sa]KKfº]QEQEQEQEQEQEQEQEQEQEs'WaHڶD)[Vc-ET((eif'DKriQ12Lz'K] gMO^z* Ipww鍾uҮR7C°]v`0Ǧ:Po}dH%I-Dpv|îi+6aa=L>h!V&9N;?㝫OYj0ZIp-3*eI JJc*̞Х{Af1,2vNv=xQ$GI'ay7&|ۜc6O__O9ZQ4icghvUS~Rp6$ f1&ngW7^)#M˕T j2F#;tRnLyI$7=-??ۿO/_# >\GCXؠf l ^-Uv?f( o 4`MW.ſ2j5_ek 8?GYC&~xMW(v {1ŗǪ_f(]W zeho_1ŗ9W`8FSC|Y?O ZekU.?g1jŗŪ_f\g/u_a/3^E V:nfCpaR6f{ަl? ѷuW?g%YUQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEW?'%Uj+*E5tQEQEs?- j/t]]X;g+bLO<ç\ n㶺ZJIJ lG2[xգ_'y ѣ;`!Ve|}<"Dž$iK^4 FRu!I9&XlnVII$; !m-]TX҇CiSgR,Ry78<x7w1rQV GQ:5{SsoYDE@_3'h'5yZ 2:Db 8$5^Imq VKi ǔaF`dyf>uفנ&VcoK&hDf\Mg j $HXc;TRo3{Qj WC&l G}GZ޷ng嶟lJWp%Yܮ˜0QA/F`[ݖI8ʦ>lrF plE6nCfa< ϶ި [mF4[=eSo3J P 21_/"_H%-,VI?ƻ GBȩ_K/dBy33)<#y9-ct/4BI ^o=wv'D R^wbqmBm d#؜{ֵ֫-Ωqdp#Z+D3- |UiG=Ʋ/S 6 >iLcRTn,n7SF(a#WEu-/-'f)Q\rH㪎r;fP$4T;c:;18HQiP ~͉t-4%j L̹ER(((((?$](ow:< ; _[5t7@w?Կj(((((((((((((((+l5W?/WMk(((((((((?(z?mtCan(((((((((((((((O8ii[DŲ%|7~z|EMn6үi'YҟR+(((((((+6!J#@?$](:º]s u/- ((((((((((((((e ;o [ t@v((((((((((~J`w]sPXۺ(((((((((((((((+*E5tIu: ( (9<{q?WA\uP.º ((((((((((+/R.\-3X&+2qF}jW3=_V?6vWW&51Zlj h]47hÜ|GQ+|F4.<\HrBԏJ ס*() ߃kcG'~C?UjQGS/ס*NC^XՠtoGXyUe&o%WZHA "!I9l?0Tw?SkB]>V-ew(&*F;U)|[-wQjWr\݌rG\ 9 ߃kcG'~C?URnoc}v5{,71!x$3jZƙqz06^FcۤdU*@s){O $51ס*Xkvq$ZuWkk#M$| *x4:&Tg{FӃ̹ ߃kcG'~C?UTҵ7g3F U,jt*\xJKB mV[6/%.z`<{_ ~f<7Gga *L v$A^oߣx^9h捃iq<+ЭG9fXREis+ՙ5y$:Du< ; _[5t7@w?Կj(((((((((((((((+l5W?/WMk(((((((((?(z?mtCan(((((((((((((((O4dFʲSqDH۷wEOnh|ߟm]O=Rd8Qjg#U,j3))Gxqƹ*N jj ,QGc‘-GgQރ.t}Jkk}*;s~V˒B1 'y+|<,nxÇ* $mI#6q2<VMByE@_+e15 ω^ne&&̣ї;r$nPr-a׵8/qrlb{Q[Tt9s^ڝaK4W&o?eN2sk?m\ -F; ޼KM~Q\ #6A?g=נWmCۿGZt u/-  ; _[5tQEQEQEQEQEQEQEQEQEQEQEQEQEQE@v++l5PEPEPEPEPEP6 ImV KV^ AME7;y[#YVWiH&%`xڅ lKk < %lAM`OLC sh" ݹw!up0_44IH6ձ-Fwi5r6+l;9i$*,'8B*H|-kR .h&id'T?*Q|kau<$'EyV'XdTgp<1GO~_\n3L#edDU7R|r+6K]GJbzldڸEilh|h1n0wnv s_ ah4a܂omA|{ޮAmoCvȪ7`>Z)\# ^& !$3f- _IZen݃ҷHd`~qbN:g'z![{+6!J#@?$]( < ; _[5t7@w?Կj(((((((((((((((+l5W?/WMk(((((( ShKu5 pAG/O7%T;y_]覭J**/ h'aAUmQQF/ h'aAUmQG;Tb~0ևy*-<1k:G 2` r<=sF/ h'aAUmQG;Tb~0ևy*/O7%VsF/ h'aAUmQG;Tb~0ևy*/O7%V%9QO7%RcO7$ɦQgCОwL=+;OK y$A*fQ,. 3ӞHVYiY_CLUx#ԗ0ZBf8b.( HךXx[Uג۽s]azMpeU%\:`y$n\y]Z}} _ $ۥTh_kd\~fP g=h-OJv dڳt{GDk%*L'+$ ;Z+ҽmxEb͐BNw r~*Lv:Ij&X[Α*lv(N[o;}8_+'vCltȒ[{HjʱcA' 7V[ȡH2=#+m>-3dߟgR-ir;sL5xKJۘRHi318nqҒӹ?9a&[?m\ uBQEfPQEQEQEQEQEgjZݦ"Gq flm[m2[[۔w,W8zHܼ2dmd-_y WT#OLrBd߽Y7.zts=`kViH;y\ "ñW" $JAy]cMG" #xذ %XЎGWi];&KkIxba"$Soq؞NXMGe]BKhZMW˧OrUZ3Ay`iwٰxwCtg"k+srEtso" 7SFA48-͈d[E#&rрȹRSy WZ;4n,j;}v(L"\ƿvk薷2[ۙ -c3E%',=NOsW hSN.nC29f w!HK&ǀI<]F[ɑl)`\vP8rxRRgxݤ'E#knhS2We}.v6mԒ̱f)s 0A* L[f]\8ǰ+vz\tzUҡKCnV$d9=-]>.|&/.-ESxl\Lzm/tSJA`"9$O@9h9hg?oEieܭJ-፞زqwcSI'o#G6:rLncqeQp8$>h9hg?oEa٣pJzk2~XDAI\ 7O|CJ?ƺ ?,_]QEQEQEQEQEQEQEQEQEQEZFshq֐[=ŃO0e+*cqQE{'(|s=QSʇvp~o羗y"7?K<]r8?7?K<GH9P]HO?$WyE. O?$Ro?O?$W}E.>8?oH~4Qg7E77EzrGs3xO74Er]JXoGojNtI 0P@3 3gGDKR*g\J$_EpsxXKm6a׾D#,^wqSz.!](5%#Pxf@GkEy֧jUm>=:3vP.=J]ЯS 3s03x3>tI\jB-m#?vX*浶DŤdu3m[qIޗWpA5ԚT&ѣ{BC 91py84ڰ= ^.k^β]:E>SrSEuxR(5 (-ntě `CCX;wиQYQEQEQEQEQEMԡeal|sd}ʘ!^'5ΗGgms-<\^smAXm<㊊CPjD "6,V<mp5%"F%Ac߹5Er0ټv߱: =zЬ`̓vI(Kdf#V"ҷH~*W*@$%|elR< d܂G[+;qEvue_ &1A'jvސl'-e%@ X_ɽcqo!Cb6ԲQH8ڤt.oXuo&]N[vrݸx; i71-Ig9MѫmA=*/<'--_ o=u;=ԤG8H3m9 gޯGY r$IvcH5 ΅忲[{ih7chEFTQzӁEZInUFI36x'{+=]nSlR[[][ L?&y'#qMoSZ &h2&T+e@=7`"$V u ^P B Nh]LhFەQT<3DjJ'[e Yn"7B1F~ T xv;O%U% ijc-ۓ[uXbq83r<='LZV#Ԩu R>ue <VϥοHL!!$2TMB3KeIw_a4[4RDIY!9Z)V5nTӢ1o$[K:: )nrrvqkZ]Y}Bյ7UpAm&OFR2.uѕo#\G<&&A m" 6}΅r M;Zܺ^sحvVOK,ɑ2 'wS_ڏḗEJ;˾gRkg n۴cnxΊ]-]_i!U嵶^R$-1-«:wi?mӭn$e*F@o\o,r`kR<΃@ѭmEa GE*l|o\6G| տhsy>6TPi"HexHoQ*`SB㺺M*n.ԭ̢Pa (QG]a enq0IotH$ h[;TA`bڛMzIq Axe!!*Arl`2zyIMly9iniZ1![) [,Ikڬ%9?+j^.ehSKP0+-%w1Aq^i;ks{tYElFuxBGǖ7U knjmhcn`5!.BO$i64yj- umE2pu(E9Z5-im2Y:+ލ' 1o.,M.F[hb@D e`<=8~\'{D)nE qn zU95_KjĝbHȸɛ`t޸?6i!CW{tKT5(Oڍ0XÝm (r7V߈(ך)!#F,y#j]ZImwS *V Rtm&WMl,umlұike hI,Aګ?GSq*ͬQE<.rKhyHEr@#y`0@zM4I`H|8W(oh9TڊxI#/&uk3go]kIsV;(3 (9~MFiZeuC-ĭm,ѽ>b8@;Qߛ/G_P4_Jجe+ؚZz?5oeEO3ߛ/GV[6_[tQտr͗#ߛ/G(adbbj9kտr͗#s09 n@8G'1AcC'gE6f|JY#o4C?qֿ͗#/XZ_X[/~{ty*Y ؅x@Aou[k ^wF'YX3*b]X,~lb3]7YY_HtggY=qPxXԭF 0~Y%êS9q>n 0.d9[\f8R@`6˸Yv:g gY='55eo7ͨP4bb||}׭P%ljN=6FU#{]rKyj;gwIiq}ZY_MC~,5g^J"2ق%#6#tCdu6huP%դm:B?5HK2?qA.h4dմMoDk7ַ7oM g"Bd^C" r!]C Wow-$2-!>M:z![Ajg-QEY!EPEPEPEPEPEPEPEPEPEP^InQzy$:Dtx7@w?Կj+o+lPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP?'%UjԣVatk.X/m䷑ 0WR3k1;,9Dru4W!5_cho 5<|Cſ2j5_cha̎?|[C&~>-Uv?fFF jp2DfH ;ѭ[H"AR[dl q]>=Gdݏſ2jРδ'7k}ෞ[Ng|K&8y ˜*5#XGoShMH!Psrǩ=wdݏ1kHm{Q2#F$$MS)Z/ϳ]njw]#x5 P +~pWgCY^x7Ò6ڝիD,Q$8UsMko 5Dž_8n0x=W4=W4q'7mxkh$bIՍȋL`01&dI4yɕΎM`3_1_Rtoi?Fu1Q]P>3vqvEJKwX[Gf; @y$g{ੵFmGQK"xˍTEڥ،+Ԝ(v!b\ƞř|@n2 ԒjdwXI%˾+vD򫜑k )(VwKmi%kmdEU r0z,/eG-B%ӌ"6ٛ|hw*6)xTa{v#cYӧKd;Et"_V ɨ> rdv0m8mYw IԲ@DuUh~չ!z0#6 K^#^ImX,q;.`7G4j,$lX}GWX:'暝aK4W&o?eN2sk?m\ 觱,QEEPEPEPEPEPEPEPEPEPEP^InQzy$:Dtx7@w?Կj+o+lPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP7@m+b/(/mlV3;QR0((((k:^IjVv)!5c iщG4wȒE"GFXPkp&ktKr$z[IӈCc\YHu+~~M-#̥cJEtrE |FێBd$odd׶}|m$hT6uM[؍KO48qiw eˉ巑t2 ]aTmÀ}?s !-IunG#y#PI?ZًҞY+m݌b[+HD^cq(q 37WVG.eˌզKdLXls훯Hf㹊Eilh|h1n0nYc "ƙs ϶}~{r"AEw icWNѣFrM\aCHf,Z@{f]^";v qHq#aK0m n k%6|'$9"mykI I RApis=cWKو\o+BaS2*i!C $+x-Z5n_$8ۆY8ݐW_C#7|rzsNx緖9C$e`zGTAS}VLX]j2=K֝y2 *;F2{Ȏ.5lmrXq#0b H@ݎ1#M49_NBNOPyK,Ѥj7*3kVZu6]If6zȤ'm`2de6vޚirwvzJ5טL "Ivg#Ǣڍq>.TI.'h'ֺM4c^i[ $20?e'q3ҽBA? 7Wa oWE7te=QEh@QEQEQEQEQEQEQEQEQEQEWmCۿG^^InQt u/-  ; _[5tQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEUӴhw-"s2ƥCXDZ8 :' "⫧5"bB8++???¥+xKTq/tOEV#vI.[\_23"ݡq+C(nzO}ɥy<|J7x 0ec>bdAIvU׬R)G&9I y\@v~'?C(nzO}˿+~oY+[{ a$YWw”l n3->gJ&_Fբ]\BfHxKXK䓿z#vI.u1YGxoSu}4PZ?#{ 1rJqqkD]xQu6 uٗ7yK<=w???F r5 7PͣA 'ͧMq6csͰ)َ@ f,WT,e.o}V+(eg$w>ݟG#v7VmVBVmynIĻ%IAv#)UugQ0C+L H:W7g='QݟK[PȕAx pN`jq=b"aڢN6'88`K=3SH5#p!54W΄)r8p ֹ=G!_k=z7^][ v/|IUȪvmt jmCI|[4v\m3}[8:=KEƍ MkzNIwc8<[M7YzFxL>$1Tq7 #j?iڽ~Oig:{ КLJaqwm2yL"4O&$?9|١of/~^k-5}RP!CXWzm#]QY|RfF0Q7%w`GOM׋t[ xb! n0Udd8BߏK!_k=Z&V-Exc}5iEjD"ԗO_p.A m|EpA49gw c&E rrHv_SBwW^V%"g<&jY)[A$PĥM~U I޸ RZh.;kI\ ^XQ "ePѻZayMk%qk5vk(r<9 @]@9I/?_+7L:CF$[l zzΦWEP&E G WM+?%X)6D yE~;IuҼ^][G6 UYkw%2)T]I:--WClK&Oq K10yj3{XX.%S81@8zUDTE 0 ) 7KszCt?{{ǫ9Ct?{{Ǩ7Ksz (7KszCt?{{ǫ9Ct?{{Ǩ7Ksz (7KszCt?{{ǫ9Ct?{{Ǩ7Ksz (7KszCt?{{ǫ9Ct?{{Ǩ7Ksz (7KszCt?{{ǫ9Ct?{{Ǩ7Ksz (7KszCt?{{ǫ9Ct?{{Ǩ7Ksz (7KszCt?{{ǫ9Ct?{{Ǩ7Ksz (7KszCt?{{ǫ9Ct?{{Ǩ7Ksz (7KszCt?{{ǫ9Ct?{{Ǩ7Ksz (7KszCt?{{ǫ9Ct?{{Ǩ7Ksz (7KszCt?{{ǫ9Ct?{{Ǩ7Ksz (7KszCt?{{ǫ9Ct?{{Ǩ7Ksz (7KszCt?{{ǫ9Ct?{{Ǩ7Ksz (7KszCt?{{ǫ9Ct?{{Ǩ7Ksz (7KszCt?{{ǫ9Ct?{{Ǩ7Ksz (7KszCt?{{ǫ9Ct?{{Ǩ7Ksz (7KszCt?{{ǫ9Ct?{{Ǩ7Ksz (7KszCt?{{ǫ9Ct?{{Ǩ7Ksz (7KszCt?{{ǫ9Ct?{{Ǩ7Ksz (7KszCt?{{ǫ9Ct?{{ǫ:I} k\W<ɻoq־ihxnđaiSڍWQ$;M?}x[l?ȴx7@w?Կj(g?oE0 (g?oE0 (g?oE0 (g?oE0 (g?oE0 (g?oE.lK*0n%oiWyb`=q0NGOEGooE J#Eª*J((((((((((((((((((((((((((((((((((((((((V_@Wh< ; _[5t7@w?Կj(((((((((((((>Z]\Z5 {uoRibPI vxKA_jE\ h'aAUmQYQZ <kC<[TQÕ_?5oJ?UY*m;zKV2IinqG<Z <kC<\eеYu. p%(D]3)*$r3$#)u]6!nDa#! pA姘vZ C t?5mHgpLz erJnٽUJM,:A$pxRk乓iKDvvr 6ܜ Թk9VB[c: &B0Q7$cPu (?٤w L]OdxS[3A[7kVgP2s7Z'fe4?M47?/oIrI)c!2T8xƝ\ŧmog^V?+1rћ(ib fû լr慒#𱇑 d\ރi+OjOyٮ%I- cNasϸZ&$jTW/o'!@A38޻hedC`Pknfl|!{q'.LjUNmn0@$רX:'kR$,QEdQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@|M̭oFihx7@w?Կj+o+lPEPEPEPEPEPEPEPEPEPEPEPEP\ua]GK&'Y,J~ѭZi/_ݍ2zOb=O$F]R&rت9j5ךVViD.Tymq<հqV  Y}9DO$QNsUi<s. v7am!9dq9쿯*oQ\Eik-PFv'[C95So} "x(J I!Wr7S"&i%մnH↻ oaٖCMjz#zdtiKs.gN}Q**ּ?xVk;+Aɑ G av oCegm-s K[M+Gf\I j[ M%'{jwwF*$ 2#?98⛨VUgX*M#31 UG|{{%MY9\]P* hlx v]E *qrO_-5;[卭GI<8\m`I=냌^vv=Np 8:C2(sip[B3$w%d/:HW$v9`J{Wut%Qo,#r28|5_CkVZH$n=I@ҵ"R]f;E#P~섪6Tiyd0f,ʹKG9=*ɰwԗ kyPĔ;pI60Or8QLT*$ۃcx#xjo/nWc#GDQL<) d\xBkK),e"A*8ғHd(I[$BO}.2zUCn2ǧBA?g=QEh@QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEWk [{sa]KKfº]QEQEQEQEQEQEQEQEQEQEQEQExKA_jk.+dبnEaEPWmcZ\] Α< sp]{U7"m-tԥo!B.nWi=Eo3ͧj6w-8Ċ|i%@ps_m퇉}A-4lob<,rv*Ҍ/E-dӖ\L<# srU*[ ~V ;:XwKlMHGTR6VpbyLΎ"H`(A+,z!7:rhΚmH2U\a vP'K$k[ʱ81`țܣg9<^BUm/ym&YI&eIVW /ˇ̐Kq  m5̦Ibheg:mV,Y  -~3n_A` cnr\Z:Bl" 䊽.G gfVMG.6Nwmz[}A2 Hm_cbPv\<I,~F9=1Z [$B?$Kq]!])X+B((((((((((((((((((((((V_@Wh< ; _[5t7@w?Կj(((((((((((((Gv9P2lA]^xwM[]C|3F9vQƑFƊ*@'EfR2 A?N<%CN?8 :' "&]ȧejnn&|r +7$ $ԒRe7/ c AmfOAűK DŽi?aG'D_U}[A ۢ+t`-pz bURR-PƱ ANYRryBaq/tOEQ DŽi?aG({?Xp!YghXGoO s԰$[0"سLdhfE˲p2`Zg'D_UxKTrbiv˱趰1%U`0L]@Yr9 DŽi?aM>8 ' "⨳3r\Vxod!PЬJg$0<xrDW퍐 ۏ }haH|o?4_mKud+zΉh}.}gv3RЭ5Hoc2w6)n5\3M>5 /TZI;x)p]}0O/~nqQ^xfZ]a,Tᔩ<{RSm⩧ƞFN%*[2日ã-([>Tq>ѪVcW]⩇~G,r+?9a&[?m\ wĺ 6A7HfuݙGԁ޽NA?_ ,QEEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP_?_+ѯ+keo{4 u/-  ; _[5tQEQEQEQEQEQEQEQEQEQEQEQEW-/]WQɫKP%΁{ @j@do)}AGs~9#77)8?:t]-ͭ]Zi䓫8ۯZБKF:Edظ:[/kaokW gF1;VVB1LTJK[ijH RHWmTc];j>km0Yv ڹL} rz)b[XL-~EϗEySPy}i]XrI5Ŭ(>hF 储 W +袊@u41iƚiM4M5#iiii3GxsM:'x?9a&[?m\ rQZQEQEQEQEQEQEQEQEQEQXZZYK5-Fx㸑ZTWgU̕ 9ڀ7hs}GsE?'k)]s}GsE?'k( 3IeOН/H,Ύ?'N?$Q >Bvl"::+Q;\_G$ .oeП/Hw 3JO?$RY{Bl"e,Κ?-C\G%ן(k(]_ugУ?Hfu4W3k?U5[{+E&Ƀ>X۵tOaX(`QE52V@WR٫WA@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@r^- ٤MSR$G;A'uxKA_jTw-Zݛ\E []IF#3ӷN#!r!W>e(͕մi M Y6'Ё[mMueklYV '~3鶒] 3 Dq)6RRS -SOi0K[yV4Rny$1F<<Ш|"27nˀ~򑴜WzZZuMZF 1dn,pA>-O/-!b rFYwfW XI$I7Su*bVʉ[Aw( ck4V\[.L%s*B{֑vZnii,ayCiio 7Wa oWIn+urO+c=QEh@QEQEQEQEQEQEQEQEQEW3=_V?6jc*Fasj(M(((i@ƚaa 4Ӎ4Ԍyu SXaB@$rOrs*h_clJrG0Ǵ]ݬ7֓Z$d(N2ctv,Dm߷n|xilʼf4F@<|,i<3n֚k ;˨UidQ Tn;nT9Vip͆4?dy-(T2>$Xo mu 4Ċu+۝NևajsZ-Z٦dgٮvr [$B\-inaa $&A?vSRQVHQEWk [{sa]KKfº]QEQEQEQEQEQEQEQEQEQEQEQExifm[sSR!uuPA?o "ºMQ= ZVi+T$gc;m: aP0r}~]B%!%s9IԨ+#R$vѴ~nD$owPp%@<eԆ|oQ0Vd OJtˈK;[n `?6^Ol)붓\,X3*\#s'#ۮ*XϗͿ^fڵ &ۉ$Tm;v@l{g"lɩ'vx\>/ˈ8tt [ 3E hO??|W' iiaq4O4Hc 4Ӎ4?9a&[?m\ qMcrڴD/\cc\ZΥǦC34Iq+2쏗RRhrFf5/gӠj_7_꥾_{xXye $?9B_j<6ƞs1l/2.a[{{ n~քHs<쫎.mzd*J"^EbU$vw[hV2yūȲ,l7$NzWˋd+p*Aۊ4+f[{o;7P$c+F.x< Vg5;yH!xw̡Ly.1 .%')׳ 8=O_iȒD2uiN>_H DHL! 67rEH,5=BKVhB aw3?GN:ʻTv$T1O –TA(G\擨gu>XHK0Xv6Ɯ6MSl ? kFiƚj aa1iƚi Q-wIp(I[$Bi|&3ܱEVQ@Q@Q@Q@Q@Q@Q@Q@Q@s1Ccn릮f?(zmLw6- "tŋo "gާMY7\16-maUK/&C2l,ΨNT7$uxKA_jTw.:ޟ[4}31VȬTG8'G_$($ڣ+-$X7VH~Ehďztʹ $H`4تBpW x+(cFxYdDV03܎o@,֗6ݣGiClc?=O6VkoǶ) E BF8j?\i^X]1H0]*y5F66e Dż>\mϾq}A?%8P0*q}ՑTcd ˩H''Gp|G"_w-[<&N#+pg#i{imD'+,ur2:եѭUP0h R@9 Bc.:}R{y&w) 1u]#rNO4/P| y5>(| %;b3}U\%iee–%0sV Lg[Ym)%;\N*; ã^кM0h!r*GQA^ycZ_Xpq!9 ¦5[Lk:($` v%jɩWiiii aqC9?$Kq]!\?ßo%A?_ ,QEEPEPEPEPEPEPEPEPEP\PXۺ髊ozeO+J[nnw9SS-Φ?LovCy{kCz?LovCy{hz?LovCy{hz?LovCy{hzk3~^i?Z/naC 7~u^i?:?-miC7~ui?:?-maS-7~u^i?:?'`4Xzw?:M;~uZ In+urO+5SM3H6q(vGUQx$SurO+e=QEh@QEWk [{sa]KKfº]QEQEQEQEQEQEQEQEQEQEQEQExi] SRؒ9E'u` o "ºMQ=}ZV X cG5q!Y()ɾ7W\NFAiՓԸ軜E{qd>TTٵ; Ĝv ?A/$-8Ŕbc$uqdcAUz{ϧK,Q\7͵1wQG5UVmV7|#_,qAun/^ީk]^8" swfnf-˹v`÷L=/XGm`m%mI|NIR}]r3M4c;e&04^e[@d?0rw0onhhFeu Cq5O*A JcK1pɬy5#QK4t8K.ɷ`'{ޚiik/Eodo;M(~XUAR=ϰ-alBJ3_[[LM(GhQOAm= "Ԕ 2 n,IBRt>SK-;0M8MHo 7Wa oWIn+urO+c=QEh@QEQEQEQEQEQEQEQEQEW3=_V?6ju-N-i4I' $%hр#zpqLw.kr^[I`ʾZ%).pG8玘<5_^?<5_^ͦ:\jq܉mN@ѐ21|[x4Z+]бY`K}Qhh~ ?h~ ?5{Z8/䚚Ē[Jl$oL \ >w+,K[XD20A*F?<kU5U5!(YߘlZK'Kn|2~_y68d^ke`mU4D$lFU1XW;07gCMyƨCMyƩ+&ڙMLjc5i8yDHc&1铐igc$\ hQ`$KC N'E(N}/yj&Tzk5C 6[}uW2m4_2)*jP#/G^F8[QAӂgmTd=Qц vAꚞ5bMũ䝫݁r嗭'wۯώ4_'Tm G+itoa] 4G{5IѼij'T-'y'Te.Q-wIyk:044|\t(޽>A?馣ޥ( (+keo{5|M̭oF=WA\sa]KKf ( ( ( ( ( ( ( ( ( ( ( ( 5\d FFɺ2Gkm^ j"8?& ?@*'QܿhmovrO$X7^zքѺFYXd{u6!Y>Ggn*ay1Qq;RB\%iւ 7qKRCn4J֦L ݑ-ʼxC vau36mqŸ \ [I.'i0\q456=֒Nj2|Ď3۸|$|#{4:] *Ap Ǿ䚝#3][m>8T9ёl=q?LZ[*Ji/.przexMk435eSBUYzCyoldicXmзFD"=# qVfૻkymnų u`b&Xyfrs{ֆ;ɴ{xZ#Kً@+q0;?#EtM:)$OyEx1Jnh4f_xFV6Zl=afdKmx =G{m]VFTwbDV6`حK2BF :ls4i8<#èj2}IYP;$aV g7$,ѭUٶ;0pnOnM.veXɪ_]lxbDK -ijVC 4Ӎ4Ԕs~(I[$B?$Kq]!]4X+B(((((((((ah]FqRQ@ؚw4biօϿ>G&>hQ@ؚw4biօϿ>G&>hQ@ؚw4biօϿ>G&>hQ@ؚw4biօϿ>G&>hQ@ؚw4biօϿ>WE5@P=Q@Q@Q@|M̭oFihx7@w?Կj+o+lPEPEPEPEPEPEPEPEPEPEPEPEP\ua]GK&/ ,͠^y#cj[D.n'بopQrN''I!$AVfo`˫\C4c*@q]1լ*.+SG!pm0vߗ*1#S=P v@Za[ $ɘH=y:SMa8+ذ<1ye 3+"=Ԭ$PeG$>uԒI"N$!hU a0} Ɨ-̶D6*FNqZ^坮eUe$8 N9֍m{Z9j ;j+n\a 3֗7r,H A`C`qڟI$Z ̌ܧp2j-1R-_RB(H Dg]-Kͦ7٣UTUn6`rjr!eg|1%Ny馦Uأid72Ȳ>h : qMiiL4L40M8M!ߊ?ßo%A? 7Wa oWM/{(Ѐ((((((((((((((((((((((ih52º]s u/- ((((((((((((+.+d%xn .!hd5%xPpAOboq"X[rW8#H=}M W3ƒ"tu PA*iAcj$3{UPs8q9SgcCmV1cVU-%Ҭq4qy:VzxgRk)TtRt쀄m;y86x9ݢi˭ba&)L%[s}{FKhnVX&ϕ)@`9*nuY#-IuM>gd$ %d;B8SN9)c6H' ānr嵯^6hal2E"]E PH2H9P0rOzoHGf.!uQXfRB8mG6$gRW9#,7p.CI4W 3EKJPFT,qNI7k{Dԏ\tO $}*6ieXĬ<}A_ u rHsgʒ%aqQP6CA!(݌CHmO$qKݿyo5ŰmC( obO~V 5]9'Ya̡tg³1n-/ :ӈD F=>On먒(_]qRn܋T{Oȩ!k 0?ftl6i4!:suPˋ}Faa,aqC9?$Kq]!\?ßo%A?_ ,QEEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP_?_+ѯ+keo{4 u/-  ; _[5tQEQEQEQEQEQEQEQEQEQEQEQEW%Hw]SR"(ʆoɸ-/]WQɪ'Qܱ:Osa5 @ n9iL:&U$(#+'[}NLj:v6/ʖL8w3wjafҤXa&uGPM8\kV /EE[t nf8l>I}A$4ɯ]:h;p[j3OjLip[d+$-]CrxSX,.-(. mqi? Xmky~R$i.Gjt- rtVlcCm+:<7wu& L[#FObDҬcx4+xݕbT r9 =).٘kD\iѭY.;O N;#u|'b0ti>@HN{Bl6 loϿeX7Rix1F;WpH':[DUz^&xtk]V卸`Ա׺<1vsG%_1 es:Uش-e'OxxHm9P[z5Vأ—),jJy=(vtz]Mk+{amt H\+ ~Y5Viiiƚi Q-wIp(I[$Bi|&3ܱEVQ@Q@Q@Q@Q@Ts  !y$($s; z a51; z a51; z a51; z a51; z a51; z a51; z a51; z a51; z a51; z a51; z a51; z a51; z a51; z a51; z a515[u['g.]3g +keo{5|M̭oF=WA\sa]KKf ( ( ( ( ( ( ( ( ( ( ( ( úmǪ4ueIנU;6CZEٜl uǷ&4`q/tOEQ DŽi?aZ_I7g='Tr_40 Ӣ/* zφejnd>V#vfq/tOEQ DŽi?aZ_I7g='Qo'D_UxKUݟG#vfq/tOESO<%CFnzO}???f>7 / "]뀂_cR5SoBGkw???F =9moEHPP8N>5 /V#vbIG08lNG s즏g v!>5 7SO<+C6UNvWLnC,bH'3]#v/dsg~Fa񟅿e:/*F ?C){=<YmWUvay2;{q)"_6kJũ,L)< *l i1̌x0AD3ssʒ"I#`yE5KϲGصϙy+psڳl&-b!pd2ɂI?6MWbY[ i"ev7]b͸u[9qvI)~EUohW:ұE5a1$q߱U[O Ik&'Qqf`r~l,s8$Aj- -/0K}3ދ!Y-q>Ֆ\`:Mzyͷ5pih52O`o+lW?WR٫((((((((((((((?d++<'aY? (+ v '%f[4'"Tq}EnGP85ԼT:6"{_+n6ɴf,x-SOC1 eq|*(Zpe5mF="K(vb2~u/XgXnؾ)ar-?zpBE+˘D4x槬M,.1Fd梪E*CN2+Pu_~ͣCr872XtTU\=7B&Svu=511IS[>3mKMQW7[5c`cPK}$1gO<5`_Tuac@{?ڂ+H}AsQXiKͬWf]W<(ry$*(EPEPEPEPEPEP\xW_)OA#1U_Fmn0뒝yjv"85k%{jsH2G ƹqĩǓ'ݸpw)*$񛠒.5`urdXQ d);9Ңn9k,Xb͈ g~s jׅ5TL XfblV0ʹ-ҬM͟h6mnq1J4])chƙfũQ:G}H5=֑mܥơw0X'42D턍@呌syW|Aqq:+k0cܤOMZϭ RY%iRխa 1szӌsUZ^4Y-(3\)[] o[ռCiqh %ԳF&xU9#R{U+an/u-RT2F\awΜ3n-ෟA Og,@ x4{2[`InHڋvz]>񦱧BTr#]Fh1[yB ܀KR9֟X-7f)x٦Rc:ԎU&ȬٲX'׽9lĞawo 6qo˟N*[V]opZ7u'-Y.,#Yai'I>^ tM7qGphsi ܷ(opv@;#!y WVa-OKyS˒%@'i$ԚrhTP$i D,kX }Ӂm7tOXaqmY88Ҫ DP!vWM!4ƚii3q^V?:JMyXjŒ%Wk [Q'x7@w?Կj+o+lPEPEPEPEPEPEPEPEPEPEPEPEPEPEP?xO²tCEu]QEQEQEQEQEsyZ襮<RA@Q@Q@Q@Q@Q@Q@Q@Q@s;y_]覮1es?LovCLovtC-q, N֛]-`<ޡ]k4'HP)$y=җ64Yrτ4y{i4yyiՍDns ` q[eI8=28sj[H'RN.[l!g`d֦"o_;Dtֿwyj~fh'wmv'}]Ipv"~I%+.}k?:?!?:?oi ?:?4KMgWv!,` OuykxM+ONgWvSNgWvM!vF ?:n!?:nni,SG~!\ܺqs$6}t?: o)7ckѫ 1_?_+ѯ+keo{5DWR٫WA@Q@Q@Q@Q@Q@Q@Q@Q@Q@KVPMx'I1!cj_X43j{/&n%6s*yG/.ӷ~?5][\}wqOm-N|䍑QF~g0qGu'q&o,138sH!9M4W彖m}V}f4ǟPmM\"[{+>ĺFU?qZH2I.d:9$`-y:_\-n]/NV;+ XI Udުj>"_BY+l.H]/Anэ; +Eq⻴ZnDoy{youfkMN>٦Gs=b+k3wz9qŕg՟纄fQ@Q@Q@Q@Q@?xkV)kO<5`_PEPEPEPEPEPEPEPEP\xW_)Opjսom pGUs[y_i+emwK@yƖŧi:N9O*A}kNkHUoX v zktYKqoy>mj }^;lzR֝i&ww-ղXNMu-ϖF.8*cFom:u6|x4/ q]@~|`0:KI$[$lIoH##w>ڤoftuklE46l>5.mԬp 14@zmϵc~k o/GH#r#?CS[ea0%N_?3rOv84+JRH Q NAӵ s,Omelڣ% ̩&Z7!ގDpN3é^}6W#E fu (=6ڭ$pꑠ,@I+EX;G$7^0kHbq*A̻=2`w"{HsB&@T$`x"xb-RHʉw"Ҝ$$OKRirZevz-C-+I4SynI\mEM-;2yɦ]hwks$"+N?W .j;n6w1@K YO' 0;A۞ W$Mi|t)"{i.c  UYl7"T%$|Ѫ*!I,ch=&$Hii "FiicM!4ƚiiM!4iizJMyXjo)7ckѫ 0_?_+ѯ+keo{5DWR٫WA@Q@Q@Q@Q@Q@Q@Q@Q@Q@CwmrV1JѶ=HaTPXtKy 6 $goO_ʭQEQ^ux^džyMy$&gcI+IS)Xi\Z+_+h/ Э/&|UErKm4/O+4O)Dŵ%(Ȇ[>ؒlkҴ42O][DF\(ϽsKm4/OUErKm4/OUErKm4/OUErKm4/OUErKm4A%B=rexK}4B<'B=!O<5`_WyOXYws8!B7tgu.MJ|?4_!Q\_!>cE~Ey7kYpAwtWy_XYws8!B׀4x[Oo іK)gw=hAwW _Yѿ/&gZѿ/&jٝPЏ ;Ct m<=E7/ +rbNpsѶq]ٳ-tҴ}:jHSkqJqWHZ+XH#.er$KEU((+*E5tIu Stǹd({^>5~W$ -݆LR,i#&V^h[K4%?SF yYTP`2[dw ~mMA%%̅i=؉n G'u'˦_6F^)k9.6s}NYGix!' NHL1`'_z] HytK=9xx.i%Zs[I!y"Qq1ݳ֓4R&t^)2I6q|%vI#2 S=I#u?L׶ǣ{<3֓<%YHҞR}{SRa[;;y-ZY `ź1Ey`ǩ3n4f(\4)PqG'8aҴ 1q6dwI؆`2}UÚ`g,HU^pHfW=;r^[𔁉cDž-0#xS3EelL1\j,-8Q$q۱%$iGU4]*,(E2aԞYFJ>>/5Xmݻ~/cb]-}W eHU\  SW5;5or{#I+ Y8OlroY8fDUv6mHݎܨ8S  f2HzE뷷ͦ1.Kg>9mimj@@J v^mF]jy;B=>] _*9 F a=Xwk󿷵/~#˷ٌn|>jkExn6O w p]ŸӳYC4{&I-ה8U|9$r2*8U%Ψg`$6?g~}I9:٤qM ^TJ꣌~ato}pЩq/cuk}/WjdItZΪ$u?}On:ޓ^cL`3,ɸEgfcϵ^t{5mcElOUlG_gv&<3}cwg҇qΥ9?9){Rl$u+,2IN#'"W-^diѬK2\gd&lA'9+^K>Ϧ8wU}hmn$ht`8y=|wM4BẶ do5NT0 SчP*]޼0ixwc߿~;gӊȉ80וF9q^V?:[|M̭oFih{sa]KKfº]QEQEQEQEQEQEQEQEQEQEQEIk|$ KY*&QYQEU[FL9%hSUVp KxHE lVFhJ(g_"QkG Āձ@zP]Gqʩ"X6X؁RHkSn^Miy-ЖDy6S̱FsvD*nt5W&AXʭ*H PU BK7WPD-F'S.#gA !8<08=QHfo,uVO!ՙKb2Z]_][WtK"5 lv3!qd`iN+iY-+w###n3\s&$^!~.V02 Y~7q^DgbITI'Z-sOI IHxYU*@ ϵKқqbxc{%iccCoܸ# U#p@𥖬񉮌B D!IA)ps9{%H@8RP>UUI#L"_aD2A#(W$.$8$ֆݚ)TZ(fshzswmɽxU:5M֖U/3B% မrJI3#$>w ,[ZJY1u ,X$qȷ KidiI@EU% gQ u0N–Z&15;HY$be89P ҵ%#{]]7apqm)f/>F3,l2 L>b)ecc;*Hѕ)#:I/Qڶp3$N#}sGq> ` q䌾br+F_i-o$Y&PJ)\'TT|cm 9-'yfh! ylA1JhN5Ste.-d^,HZsrqq3cԐ \GO}=1Wjߋ&A1mye*$۴8x4O,Y7@*I8`BeR}Qksñ_Cf6nU2LKJ%҄eF@70]EiK &PXRǏ@9?AMn)uUKgF(2#EWZl+ %XUp+ 1qEcLMR.Ŵ^1X"sڡQQeZwەTlg%ؾi cxh-Zo2)gUbȑ8]j7O_o$ȾJ3<* <|Һ+t44wLӆIbx~TZkF4SHhM4M4sRn?G\ףWI+s^]pQ [}_?_+Ѫ$º]s u/- (((((((((((+? .E-uU^5|F&Dme[@k Ӄא*'sE`AП/H OoYEeb+ OoYEj'( -[W]A1KDn"SO ӽpÍwPЗM4H/s,q d0*;`'h]$ ? O$SW[_Ձ]Fv8\Z"2s,,?JPaރ;zK ےjSO M ^oo HFm1W3WU B~"H5?eibť{6kq%O<˽Q"wB?Ȟ.͞P մogR*ȃ' z{gk OoYEj')--3'n.^RZEc3Z8u:|FW#29nºm xe@; 2]b dq?5vj'(S?[_GK>Ϛwq˥CeZq[g_`0ɭΪߛ?s,NHͻst]$ o$ m1[X\ju$6PҾ_"M"CӜ՛߇77\o,"B$$@k:B"С?HR/fnl|km4^Kr<1򶲆\[s5o;K}2 ๔_0F񤀲x$jo_(k_)_ԿQֿ$Q}_z_y/k{kk[B˹fp`S8k!zZ>XLORW_40 Ӣ/* Jֹ?VRyfI$hKFzˆZ)IԯiExc"1d yb_40 Ӣ/*bP4+$e1, >[RI/oZ̻H,3g6 /RxS};6 AWX!:%s]sަͯ٦-) #n=j#_ Ϣ|_U4Ÿ3hIB{o,6͸Hۉ!:D #XƞFifѿ>/*2e.gvmCXxWm-C.TtmiS? ˣt_U!񗅿e:/*0!q^V?:H4OLOԬY>OMMWT>c-¾V_@Wj=WA\sa]KKf ( ( ( ( ( ( ( ( ( ( ( -Zi <=w}s Zp>Rd2kOH|<8ʶl򖳫{hiNcWMԬk,n# CF{A##tȢH!Hc]ơTg8Qݵ[3Y &ƧrXʳv*z"lYLbywxf}c鶾%kH%I8&?J1m8AFT ֛-Z-dBv$) %0އ$ /uM )T|0H')^֦v$ĚTNpWffES\9M>&Ÿu2>Wئwݏ/fNR2]j7gyHv9$ےp1Rvg(ԱBv4UzWTUu׊tbg2mgۄ'<8N! \;.xmWI E}{("D6圩l >J, PD1&AeGm}rKeeUh%쎠;>oj|Oc rؖ-KyX ;W'RZA7=S+<_L~^UQ<٥\]}F8Qyqޏzאװz=??kyiQwlTm;FN9b3-J~=/b+],kK9b13r?-w⭷fզ"tV*<vHqu^^u.<b +* AW#D"ECrW9W=j86ܝ|G'"** <|ի-BP(p,/Wʪxzyٔȑ6xGi4M Af$m"DWTo#HiM!f4M8M iis 7Wa oWIn+urO+c=QEh@QEQEW?'%Uj+*E5iI$pJꈣ,p4x9%x֊gLp7c]K[t6FbIMa[$cd mjp8u ^ 6[N`v ,iOLn7 ^F8MՖBR cC}b*ؒ{~k*қk:DivjP @]cn*>UDuу# GCwiA+LɆg9ᐂ?Pѳ;]GiѠB$doP {K)$3Qs-dnlyWCn2z24 (vR0EV.G+FP[ff:20 x"7vvMKK^iM~w"RV$/1+_KR-Τ']\(v>Lgj)9m|QE;=Dū587mGPʱ,,WU)|O 8tzݵ|IssLRYOBijZyKndx21VEJjmi*H=7蘮M+j6ki4&'´#q m^2H9 Fpzrɤ4'7PDF Ԑ(Hik[,Ed`@\f22 HYiA0xPøBp'8R+*d-T7P;k^[6rZ]$ABH99HA" qXTntK1>kaIldyaycQe `xhFYVnUK9jySt8J$hq"T9@6gs3K$7-ʱ9,bsʀy>4nMTƖ0G<6RFI+4~[6 W!lvr=R?XX fR(L ܁ʞ硭=2Dd啎[%$zGYa[wv߻c8Z?H䱊mBT{skqq,bهďz)m|gcnemqu3MX$`vBŸ$t#$I[k7;+v2F̈rUғq%=52ƺ|6OwqouoyZyh y_^о3;K;1#vo3ii>+R%JJʪr`r=Ͻ:-(aFym`H },:2pq@Dxu7.y4!WΎ]w)ہEDfkh)];QR(ѥϖHi<8'{#(]d6[*ёj09(uDg̾[isA;y$ '~GdPV6s .22qHu8W-Q$]5Ow[w$R$bgNTNsWƹ [Ro5௖S#` 8WUV#1F1dž,)ܯ8]/Ķgoptw2$AX nhS^]V](-l++Lp2-d*g)xVmWOY[Y72*Wm 9h[e 7y{momϵ7UeO_g<2xWdXRKjUy[Q,vqg8b71 # 8Zit6G܎m#=+ZFgu#k ysngf6] H\4K欄 WqޛI2T5oQ|/|ҋO]O3Jg} l?20Trնx`s1#V{]oO[F %HQ%O*񦕑IR_q{iԑs6B_{)% 5Ӽ=yf[i)-cw- )+¯]aI'ry0,mWϽg>5g&hZm6W(3M4qVFӿl%yomlnjLl$ o;z֮$X嶚-DAPT>+| VsfVI4!d82!ykxKQpdK-"Sc2HX!U䕽?avY DYYD!R7od2j- C'-秙`iOjͦ}")|hn9$sֺkNy9֬iL7In+,?m\ k>{F$.S+rsR.|hm/ vgQʱ;`?t w ((+*E5tIu ~ VJ4 Rv~jζ2G$|ee%7Z[q;l1~-a3uo!ia2(V===[v9?~!Ya:6lYdrI$ yX{F =I< #[*j,_/8yq&j$ᦞ-KR֦Qs`$aKDK pqZ{Iw4Ge ċ0È߯5rHE ŀ bݸߡ?L4G{ƨL]owj7.MihM̫4΍qH+ӱO:sﶉ n9,I$ryiQ >$՛7cCwݺB)Չè2yw&g#TaϮ;5CWщItk5oІM㐾|^vۻn}h|,DI]YUW  >G 3}u?0?[s^+qM3 $4+sӒOSL]owj ~>bf~>77}^,ᦚMmkj|]϶K5J.mCXiRRͣHk7}if> o?+064/%wk?%TK4KyƩYѦ>+ӿY-QfF·[IQ`t=u"Cݣ\HM1ЬI'{V6j~(u%afn"ν]2OvIoM{Mp$״cGK[Դsd?0E%JWCC~ln,.&fđ# QF\#TV%#ڧzz??s?͗#AE1#ڧzz??s?͗#AEsj9ƚ|C+YLfH¸7vN>Wy\xW_)]_E3k[E2 xՊU8>j ;t8 a#`8C_t*[knA8BOv&ۤ[n2be;I5/No2 Rŵ ?*9V)VD7dޡ FFGLEHdk7mхK!P nI'rsǙjwO%aZ$m9n#s;DcJO4&D@5 4Imy+G6Y-{мܸuT> .Dwhg}ڞ<>RGW@B6s77y㔭_b_ &&{xeVFNW<~8ɬX[zif wѪev۟o[ |tN].w҆>aErQYjڑQVY/B`?0iz :-pv}-64W;_v ʈ]*$K\Onumqmq]p>qq>y5ޥe4)_9yEw}HgFK1dHܧ# .{[=ėrBV,r71 r~HaǧC IoSRƚCJi !4 4N4@ƚCJi !4N4HCJi 4M8M!56Rn?G\ףW\>a-¾V_@Wj=WA\sa]KKf ( ( ( ( ( ( ( ( ( ( ( 1u--xm%uҭ"^~fQƻJ|$ KYظn_ѯԴ{I-d9Sr6p{d֯U>1kU]rI\}ECi)gK]%ѡegb\}`/ ŗjfK1NO"L2gqkx|B8(f҈Lh0Oibi?j.Ye:oc{枋FG-Sěw^4Q]$nA}`۔`^*(糶n$Xd%wS˵yApkGc$hVH)G`*ѳ"0m"9 6ry46VuۑnVxRQwą;8?"Ƕh ^~ײ&!r#!t H tޭZZGgm4y,'>P_Gg}QEIaEPHii iMM4Ӎ4HiM! !44N4Hii3GxsM:'x?9a&[?m\ rQZQEQEIu w$Ŀ M@֟ٛB(SCȪ\.HV0^[Ŵ)$NX{+y-]H6䌏¥4 ZHOrb(Rc,vFG' {y;Dz#s|8&?;cUa.'̈́mn*B]&nlf[lIڌľT-|W[x4i.ۄQ9<9_Ⱦز,gyf@7w3c1E+_+E,dljH%DxGFrP;m&`v> zwN͕= [NC[o;sjCZ2ll3nnݏOT)êy*c]~1v9S"c6L>]mGݱX6S[y#$;mB7('G<9i!v/!-7 o'{VIq_o.evbĠsc,x/"nhڗ:dm3b!B}H2zT-q%4?f*F 啔1H? [ooZY7qn 14YiiKs0BH€T9M.Ze!"LFgzۚG6>Ҩ9EႳAj5qCWۤQ,*ɶuO+i\Md`IdV 688iq'ǥkix\[hvgi4www,lHUQӐ9b\omFiiPHiM!1iƚiHiM!ii3q^V?:JMyXjŒ%Wk [Q'x7@w?Կj+o+lPEPEPEPEPEPEPEPEPEPEPEP\_-eeA ܶUK̬1Wi\go4φrA)p2N3Yظnlh3iMܗRF(Ux3Fm5mn X$q׏Τ5;=^;9G 8$dwi]4QK`TQIlakvTPZ]:}&u]ݴ\89U#mfs-cd '=z=VDݙ.J  8<̭TJ ܤvOjnN`*ۧB1OvY#nX0s[%A2Jߩm(EQ@!4 iӍ6 4N4HcM!4 44M8M iis 7Wa oWIn+urO+c=QEh@QEQEW?'%Uj+*E5+Mp+#n>UvѮc9) >B |G m$2sN:[[q0[}cN[`>.΀8'kPE3" 2BjK>:&ufM̓ RM#'aD,m ,ϽwYs)xVॵĎ@e_.V kv'se=k}u[{w٣RS^,i#6H9짓L}CYn!x;fKHe,VrH  1;Hjyyό^h\ RH=0j-^8$$ݗ07mϨ̭rJ$37h;ƞs* ̥@]{;fGkc2IUtvZTK hMEO 2@'KvbsHiM!5ii 4iqC9o)7ckѫmוF|([|M̭oFih{sa]KKfº]QEQEQEQEQEQEQEQEQEQEQE%C=0ʶl1% )m%?/p϶+: Ζc8"]ơg8`Tw}aqi#2LɌͤɩWL]QvqLwRehtv稨i8 _.VG/dxcǐ.7 9̳ Ļw)! i[t2R]t1G2_jWx#34cVbPH-g2 4)yv*8K}O^Նqg^3;2:+!%a#nk>fGkc2ĪX:  ;jRq42 ndG62G5E-i%QEQE1N4@4M8M!4@0SHhM4M4iqC9?$Kq]!\?ßo%A?_ ,QEEPEP\xW_)O[q"B`Jwxgiq+cOnR`[y&8= +]J"QPjQEQEM!4ZCHiicM!4ƚiiM!4iizJMyXjo)7ckѫ 0_?_+ѯ+keo{5DWR٫WA@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@r!~xpU$W\_c~~W_&^A3gSb#0YNA4ꥤ:l6Q45q$ ~f5 :йO5 ^{0vOAkj%@$r\,lB@` sӐ:\~ ST\rY.$fd n pdַ^y5]AeV9V%|@cW0w !ei@~Ɠ$PxD2@`|p0āڝry:GT&3~ff8 m5ǩuT['TDm}+y,ahapE?بp=hQO_ͧkV:jCKHjMFm8iM4M44SHiHiM!cM4Ӎ4iƚi H̶̄:c ?1Qoc>xNE&c(<ە@f8P``~YpM3M#I20t n:S:+[[(ovjXKy!2[J\(ݺ2c9=:`MzK{[_:AA©F $)1Pt{Mmc5^\k71[Evڂ, Ec&e``ep}z xu;d{kXD20A*F?@U;Hk%KoT$yk&sR֗KzCKHjJii4Cii 4iqC9o)7ckѫmוF|([|M̭oFih{sa]KKfº]QEQEQEQEQEQEQEQEQEQEQEZ=;ះeISJac쀟Wi\ol=tM斓GiщAG0j5#cUQ@ 0l6}T2k8-w3Jm2;1.C]>5 Tm+X`Y#)*d-{{ eMZdgxv6RNdm1$Z. ;|D#-rbՑ-I kڬl/lD c_zV|Dl㼐\ݭKuXA'=LH3&fYDdkY @)^o%d$|K߰&r?//].=] bn7'd.m-N 1jRX6G̸lGLw6Ѭ!bGAW F8`) A IݜRcJ hgځ底]w bzQӹN/鏬&* &3]|Cuq" PO9G4[$q9Ժcb2c c;UY<=ۿjFm'%NsҋIT4N4Y 4@0SHhM4M4iqC9?$Kq]!\?ßo%A?_ ,QEEPEPTm6gFEKy2u*H#8>Q@UׇL.'dɪ߻3]vyN {wXH֒End@s^EBso 5YxW>#[qA)9_v=!V?"wf'dݏſ2jNZ.ntsZ?sǗjԢ.ſ2j5_ck 8Oɪ߻3Gdݏ,?|[C&~>-Uv?f( o 4`xMW.?>3L&:ecu|sɪ߻/3]Y=5_ei?_ zekU. Ǫ_fǪ_f(]W zeho_1jŗ9W`8FSC|Y?O ZekU.?c1jŗŪ_f\g/u_a/3^E V:nfCpaR6f{ަ(Wk [{sa]KKfº]QEk7w^\}m|żduP6+V_Ÿ#?'k(Q;\_ZV|TdOН/H}GsEkG;TdOН/H}GsEkG;TdOН/H}GsEkN3{FP;\_I E |^.l# <I$q9]r09t{ŧݭ坩K"8,_enM*5)?\_G%w'+<Ϧ[[]\,ӵ^*a&$BǜA^Xu}6C#˸hG9H\_K/P?$R[yB,"?ŦIzE,4Q20 d*vp ,ϻ5qgo(l-e~dt($V 9O\7/G\I :ɇY_$lU9{8Ӣ{kKc.Dh'|~>fQ9qG7Rۭ׆hΑYQcRB[tS]R;T>PA_\}@#ZA&I- 1 (nm?/`ϾkxG[mmt#ĺحHcVK2QTm&94N<"oh_äǩJ dWo 5 ߅|IlqtSA`q ÊN-Z7|A=[y3^AHDYyqNu2jC4V1,-THy1M3p1ۻ;NN[akK.tNɀOv:g ɪ߻3O̓]֢ҕng FHҕo ڛqmu}p}nnZ?B6C;ۻڳo<j&#{\tf{k}F`կɪ߻3G.IVT}G]t ֪fӌm=6W879,u5HGVKpV%6@8rɪ߻3GdݏPKIUotkQ=͇7V '{[XF . n )>\91o 4`MWvwr; vzC%ЇKhy!Nwd;`}S)wY Q0>$m1%}sӥɪ߻3Gdݏo kMcOc:Uɹ{=9ϰeG+5Ư|N_Dq;>'dݗqia)?dݗɪ߻/3S\M4/?c/3G#+U,͇::cHk)U,'#(U,/e F_0ŗ[0ŗ~?9a&[?m\ ֥ i)82;#S۽wֈYA2ƪG\UɨB(((((sşHkgc+Z(((((((((((((+keo{5|M̭oF=WA\sa]KKf ( 0wm8ut7n c IJ3E:썞YJrd> ӭZ5EpUkLB> Jc_B֦:Tӭ᳸FU3*1*1qV%׼S Χn%#pܜt_oM&xIQ* u$KE+{RxsNg7XCIGrj(<'[Y5E9 c]J]BFݘ<[57;_ס+ Co NȺ ]YcwkcE] x?_leSsB(H ( ( ( ( ( ( ( ( (9kr5oj7[э>.ؒcSx9͵Ή!;ͺgʹCXs&"$62RofUgb.0H23q[Fx}WQ, ֫nZشbĴ78RwݬtTQEP(((((((((sşHkgc+Z(((((((((((((+keo{5|M̭oF=WA\sa]KKf ( fM)C~lt KoY=g5=(YoS&/?w;SaƓk SmneG!%T0`F A&t KkY=0 zmmT1K0߼ 5tKkY=0: ͣQ:Cf~0Z 6,*4OЍym. vYfQvD^^kz_ M ( (((((((((e ;o [ t@v((((((OE]Q_۪2[Fs289g,^:\g V*Ȫ]6?Jм0s^yۙTU 1]^Ykv1Zm!&g' (zC&Eʓݴ^jIko$:EVNx++[8DnXs,ajm̲F-ʱy;IwIێHS0jX;KCL\I9vآW,#,U P {D73oinlฒ1 vQ6NS.~!h(YcvXHqooj&ʒ]O3p$`sҟ'4T`ݱCm#|NryG]ȴuψn h|8^GknHc6mrۄ/Ht䓲~3KA(KGE(Ee )_ iutߴyܙ|s<'w_ך@(klI hún3H4wb$Nj]6u;tL1$R2v1\Zz3QKz}jrpmWAi+6|  <5PcSR6R&퉠^-#"6q^,mH Źk!vH̎@@}2k:]qnu36J@vRIbGmrVv1uztu(xzQ6-:[:.YF'9:VCmk m ZGf,ǟRI(((((((((((ih52º]s u/- (+?)aW;?)aW;Oa7zŔv6vY35'+f+fӶ\}Χ{kͶV|rwf#_?1_hֺiV _ p3![x.U(2;;=Y$VeQ'J񆩩J4sB6p2G;#$1ZvZ{u ÛE'X>F*{FGJch:u2{:Nnl ;T36r=iPeGVTo:1Cu7PjY$@족Px==-K.1,\,[rkWsSyxNLI C~lQ=X[,5 rJ0O5ʪ)6&M2E[7,%:37mRo4#WZ6_Htck=`J ω.쬮[{k1m넌H|#!0Nk{Zݵ"DgA͝ezc {zwwl55ecߋ/G\xjw'KX*h.e9%[b淆WR`cH}̀H#mP,08K]ʻ?bp?ŗ#Y/mZ:<Cl/pAHgMu*[]ZFӤ/z,^h3#CvrBK)kP+}S}XVXdYU+a"U?m\ ]AEPEPEPEPEPEPEPEPEPEP_?_+ѯ+keo{4 u/-  ; _[5tQEW+G a܍UG<$?w9b8íuUxB'ko4OK}ſ?q/#UCvkc%ۼAx%u^ zr3SZՉi`ſ?q/#QDĿ[Յqa!78ӵO30pj ]DĿG[@M5U񝪾ioVLVB; Ү< m=8 EV?Y ˸RnaԻ1sko4OK}ſ?q/#UU}Ȍ( 6nz ɼugai[4B$ovZ@r9ro4OKwh7xK{m [8GIB6Qt^3إ֥jcVәQUnqհ89=2rrg4_w7V2٥͵O RFX>ӍlԱ;Xmei2܁MaXFPFy\_a!7~+.ynU@m5jM{4^R@*5`Խ Z_ѿm/#S ׊ _GQWs6POiHn9MJF;уs$OЍq>6e{%%9lT,:'w/}K[LnuW?n?ZoVֹ=G!_k=Q\!_k=ֹ=@ֹ=G!_k=Q\!_k=ֹ=@ֹ=G!_k=Q\!_k=ֹ=@q>%[ѡKۛtsmV) J>9 :Ct?{{ǫƯ\66wo_5f>)]HBK952ml5nWxHw^M2m.7=GgxKA_j}_FVD-̿_2Eڧ脎K[H<2q3vHdbBI:q(̰(((().`KFh;qpF2x":igI$/mvޡ[CjU܋zf7Kv1 ˼ȹ"AW*C]--{9f91#<{лԼ?=Z]]X42{}>aRrqk76[ǩ%u;$s*\3LXU%K?溷QNF{\4ŷ7n 5-{o߫ΖѥLJ s ՈS*ņl.-.g'hݔ)8p3sTugZs,1K ݉Pb0}y<){ )i\\ ^m>Pbf8vy8%f$mf@p8r@^n;9.[f!y;( q>>lsK[p0dM!HS+n8)X0$pf!V*▖c`xJ.,`6;$ g'ڠ'K}#VԘ#{PỗPK]m&ՍTcB%4=G- ka <(bUϻ$*?*94P G4 45#Bne$.FZjnF U*TÖ vjt0/._e="$wO#榖I:$3,"25Ԭ_RPs ~5ƅ/(Fe`G\ WZ5ttRfeɍ#2v7OsjvnEbDmd,p0v㎸9vwJ捛" Dh.U!NWrؐM>Oid62<6˜ʸ!IoLΧsljQn쩆 'd|s^-^kq[|+/$D`qsC] o[.o9X8Ha`wݴ8F}&PC**@Eڈrp \r9Nb) ҩ&k$bs1=~;S&akW r,Sg|V٧*S[ l3cܒ0ԽFԆ5#9?XTUhc !cQWikgSsB(LŠ(((((((o "ºM]MrEu,{(,((]jܴWE%φidcr컎'*q8#\>$ۻ8ϵsQxPoHl >,:aLh[Ÿ;1KS'BFAu/鰼kxⷎ^1$)s.ⲎmD2 O5 SD2 }Tm7N7aqjᰕ0m`!r䐹eFZ/جu,?/gIkKqwfpLJZX_nQG /SG} ҤNʄw'ܐ>NxSMfiiI-zY\0vRN{ezkkzJkjBkmMөPgJɱHt{ia$̥@W,2QY@8o [VA2Ln\̊@epxKVȯ&( r S!=kzA4HjA2@kq0X(=I*F[5 Ρnmrp: O3+$mV9LHg^q!@O'DVA@h/Ս_ב{'O"[ker70@rG "Xom@Ks3n!$J/bSE;9#$ކ׎+$՗kkmw/ )윜7]u֕{xvH 4NIPr0x\ޙonڽCqj CBiiM4Ӎ4?$Kq]!o 7UCDc,?m\ U?m\ ]fEPEPEPEPEPEPEPEPEPEP_?_+ѯ+keo{4 u/-  ; _[5tQEW9 S¯w59 S¯w4[R\E퇘`@$Ե}#R ;Œ[$3kRе{U4gSqEOJ+ nY9RyQijF0 < !5 Fj@c !cQWikpVC}ew~ xPWm"R~]~:uM7%Q?wC4ZM7%Q?wC4@M7%Q?wC4@M7%Q?wC4@M7%Q?wC4@M7%Q?wC4@M7%Q?wC4@c_Ihu8l{,Yl OoN3P}M7%U{&j7&嵺YGԛPI \“A*KV~Q-l5]CdRD2lD 9#t}]YҥRUa&"ou~ {/K&}Wh{xYqTP[f{wd[_ _F~-&hZݑJ$qFzvҴ+83~-&'%jB}3J7DX >8R|!bYiu5Aؼݫnmw/-RF9+G~-&'%jG^o ~ *-٣h8_ _Fo|o[H(FY7tIxc4)-M) ;)!#`IAxu{KDĿG[@M5V]ԣ HU,%6n1;0O8*A(a-.^RL0 rGQ4Ӱߵ'%j>h8heӯ $i".n_OՖ4b1Le=8%mG2ako4OK}ſ?q/#T-g[ K{wFDZA9s9 p tr1H6q giRk0ߋ _F7~-&H/.f(%PYB(bB19-?6Zm-%yg0HdB,Yd*@<{cyU%fMLR}Lwh7şo/#S5-7v km\u.d/e5f_ѿm/#RFM:<llYY'R?4ru7c֬$ iuJ6J@$aG4M׊ _F7^)6i5-DiR# $)c0`Wp\A۴fh,>G\s:*NM]OMɪxj6h9oz1o$?jkGxsMP~3ǠX:'b:'b((((((((((V_@Wh< ; _[5t7@w?Կj((s_Hks_Hi=kZ:MS *4@}p7HF2r:tɭ(KKS^Eݽ|rJ#lI[j\nrsު_WP.m4 v'?0/OPT9Ud }FA!ttRc¸ 1;)-J= hSpX1HE$Ѥ ylK6=4\q[*v(6c7Ml HQ] *\D#[P08qSIX[;w%*Pt\c^=>_y4NtĮU '8t_ijD$znZ D,bPV"ƊUF ^ I_o"aa,ayCiiԆ5 s1 Ҩ? B5@1BJD</EΦQZQ@Q@a-Whya c~ͻy۰:uʂuy-<$[ ut)ڌ^*3մ$8$md޹$d1^KIE-qHS~^PKd.9^Zyh$X%a":6; szLY&-qnsQ O;~y*I8ߑmjwe4 d1B.; Vt[> =VO$G{`yRHI+2nɮ4d?3ryxzMF$XdbÜA_?߉w-=.;Jf4+Ht9ˀ{-GZԬ|'9R<`F1*PZ#&l-D Krx 1LZ@kp2a?o11G@44JW- 9`A?.*4uoIcd'1!?8zknҲFT+H{MKM mW-/]WQɫGmpZSQؒQIlX+Φ]qdQ4لbcHĀFGG֝sU@=p3 I0H*pұ-,u9eQXԂq銒C23H%gHv6`FG|/g^xw¦bwiQdXX8=6hjf[[Õ~-\zegqEonVFp>Sr<j.^Ȧ~%P Ų@vx6IیQuH*~=, 7P$(ftFFnIѦhi#hẙBaJW4,.I%5GPI1HSZՠI R(/E=L@ NF?O|Ο{~+hmb ȡ2yeb:+pkۃnr:OYIuV1<x̳C*o2k%bHI.ĞW9 ωtw62j Շ5<Bω,&ss3a8PHv:ކWJm~=;3YN mgy[>8s1Y5AI적C ʧʌNW-ZYq,{mل;w7'\着;(oFY-/"QJ.il.N(I#k)6[%K^$1ҸUeNķ*O#[Co@ yJŌr1<AtDf4~<9i܇a%[x&Iq'Gtp]dt\[hm'Gjȼףܣ[ 1/0phʫYSr{cIsiա %;MţSpx fj(s~&,U$Q*܉sy튏Ox"J<7mۻfj׿ߵĻϗ?|Oƥ(w:2ZBqFZBp{G#Tr_2&G` *E]~XPu{o j[Qy]`Y`0|;c;p1=:HV+(ۀ$`Fހ1p5 '87wURhLA9:6%?D76 fM4.v89=#۶+ 7WHkGxsMPza oUa oU9Š((((((((((V_@Wh< ; _[5t7@w?Կj(c|/9Ƴu 7[ѽR4l@yձOP(5SԴ7Y[}SO\:u ʡF@`FpHϹIeOН/Ht;3+g:?VxozW _IeOН/H,̯U^Y_.'N?$Q >Bvl"2VxozW g:Q;\_G$ .Y_.U^W}GsE'k( 3+g:?VxozW OJ/O?$Q M 9p2VxozW g:sE'%w'(]Y_.U^K5e^С?Hw 3;g:?VxozW KQ?$Q :\e(~hG4:~tt2GB+v͌g$\&7_(+wIԡtkRdX/m㸍d0WP3iE((((((((o "ºM]Mr>K EG5LRmte TبoR;hTdpq)b 1cǩ+՗PGQ66pWÐ:zsU yK'`lp$F˻#vrAHboI `(Öf8$ AYr#DM8M#16ra1v IyLio 1 ,qU_ yiM4Ӎ4?$Kq]!o 7UCDc,?m\ U?m\ ]fEPEPEPEPEPEPEPEPEPEP_?_+ѯ+keo{4 u/-  ; _[5tW-/]WQɫ[_TObEVEW?㛙 M$3e+,lU8 Ai](1wmܑO"]$6אf ]O 2BԷfi;mR=NdT3+I=*[vIVWj>7Դm;͊Boϓ̑r5t$ [&:w T\4xf=YO?J\oGcVטi7{KMUKf6ѵIj#%Ua泴 O -BFi.5ˈ PK3M4G/)ϩo[ f$``}qWo"XֱjO<11$#rs׶)8kTI4\#xV]j; P@KtkF Nx 8}{hM7<1>7aC(rzE%_Ù%k#:橦A(T0RIqZ楔0M8MHY"n`_Zf>ț>EzwQEndQEQEQEQEQEQEQExKA_jk?_Vwwus&o{8#'Q=iE`/O?V?_YoQX?Km5 UCil+y^0:J+66_Z jn8'TO$@ AG@?V?_P%|{`(~V  = :J+Ox>HH120Yl! A%B`oQX?Km4/Oz_+h/ Э/&74?V?_H|/OѠGW?_H|?_fᦚ> /EO|'BƋ4hᦚ> /ExS"ih3lMbxS"i? :7E M5|_to> :7EѠͣM5|oo> Z?56s~(Ix[bk]փaxvK=MG- !8 veSIXIX((((((((((ih52º]s u/- +.+dן¾Ԭ .MWP4q/&,FO¢{Ҋ_+h/ Э/&,ޢˏx*/6ú1.,QpJ$ )l#cQHsϽA%Bc/d΄PZNIA ?V?_U/5-.%P<7i6{H#@ni sV~>n.,\ā,6p::*s Э/&;^rfTYj0"H~ qbxK}4 Я/& 64!OX/&|O4_fѦ> :7EM,%e.-F m2?1KAni8!Y"$l2Q~mkFZɬυ&u\7-hY 3a{M>in5efb!\*H`Vzzֹ=G!_k=ձQ\!_k=ֹ=@ֹ=G!_k=Q\!_k=ֹ=@ֹ=G!_k=Q\!_k=ֹ=@ֹ=G!_k=Wc]~U}Ag6b[;3ïJ7Ksz jeΓcaj7vVmr4.H cS&Vuzw4NZGu& 3#d{Wy HMH c Y&n~`wQokmaedN~o$]~H%byKKۉz*2{53w4.Ih.oc#2Abxڋ99=8\#~Xk7='[fOuF*9H8)lp 'Q+*8it%kPfGVflKeHn6tסv%2>txJ[ʧ0dP2`=6;'By`v79`be _2I5Iuq~I4`f)W8=94[e$+} 0[ e'yoVe_UJlٌ@FPxq'4IMYApjr\IZg5>#ͷA]y$B9o#Ώ(`9sZ\k+w{en$`q R=N?or l*JYv(r5t˫DcLRT9ŽO@9=@"_ B_Za6nheA|:bO0+Et +܃Us'0>YPBP@0sM=RI%snmu,i"}N-xyU8>&E2UB/MۼA㎠sÞ=ΎǓZdE@qm5w#(,zz ,4M4M4i )4iqCM8M iiii 4N4HbQ-t?$KqU-@urO*WurO*uQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@|M̭oFihx7@w?Կj+o+lP\y HMH c Y&n~`[\ua]GK&Pіt2Is5f@(,N_\}BiⶁTԳ#U$%ꗺOMӵ 3nPK ..lY#XS0cp vTi:E}żV䳯'>u߷NI J5 pye2l,!ңЃvSĮpwwaC)X<2hh>zpAZ:R潼XI&H(B]S$+-4ZjskivEdS,rFc dX7Y5S7ړIFBp:RN7B^T_~%[T&eKP}xnl9>QSi깴_Zk_iXZgX[mvwP6d;θ#nk?E5:j zܴZ۱v#8M+>[Y^wĻs끜uj}NtۋN |$9RxnBiO#ӵRK[ĝb!,6(qlTZE4Ku4w!, pcڥnq溳M5&3" ЮCH~c>Ltpۣu,w62G9֖\oooGhdiEl]d9қሡL̟T`FrN:Bjm]/ijܽս[݋eN+G8K skM. ȁ+P  ;[i$տQ/G_ Y/gqmtMydgf~b8V57qNJ2αo|Sz7{clIn`P42 a# r ѕ8xSm ;Lc*Toܩ'( oKi)DiĥK@'uEspn |t{"30F YCV./yV0̪eYx]ߎ񜓗sF=i3 .wʀXu0OԠ6<#m*X]̮±)c+Gg9o%Wq"G*;O2 fp0=q%ƥXߕWIAE+q1,NA$QgNܩ9Vc;F>aAgqi +e[3Zmo*; VuUc9nO?(9&iOs%UAb86 >T4qƚCJi ii4N4HiibiiM4Ӎ4?$Kq]!o 7UCDc,?m\ U?m\ ]fEPEPEPEPEPEPEPEPEPEP_?_+ѯ+keo{4 u/-  ; _[5tWGjqb#( ^Izr^i@6$TԶ$QIdXGj'Q#z?p͗#՝}ZV X cG5)" 5b?ߛ/GO o=bY\~ָn5Ic,)DC`)}.yot? =z]M3~RS1t*;qY|6%yqi-m2*ZH @Ickїecmr! r*KojtRKDYe۱X8R gJhLFYW1}N៷PGjF]o}B[B!v. c8]3ͩ{PK1Mب k$WZ}Ɠa+s%w.Uv82hG2Ʒ2?Ȯ2"B.A9 c: >8Mw]-1Q CR7/\S>hwQKmm3KeX$+Ot:7WՒW32F Io$aԺZXtB k|ٙ1{F ,{FoxZ]0jW=~e~\ua]GK&#׬4i Ǚr[rORE{۴.ᔡ MʲGTw:dHܧ# thK6kw;9iNOnj^T+qx?CY?"{jIU/;=5C]傥2NdW!//ŴqFJ$q#Dž]T*qNIвı5ͥ:KsHr<*#7V]E|hSAI9?>.gHʩP=?:e.wo3^Lc.+CJrEAk-B)-[ed@oLmEH8QpcV_3D<+O?rZ}fdI#ܬf(gBz~WAgrk2}98aztww}S]e92i7@ gqqiG}mu=ϙLAw2Gr8$u˸st:m+1ORsq.ϕ$Q8F’khVdI܉?w&B6[}jz[?f$.m*:P8϶@i/jMtXZqC1Al$fiZiҾ"#v 5fبiƚi4SHiM4M4!q@4M8MM8M ii5?9a&[ s~(I&[a oUa oU0 ( ( ( ( ( ( ( ( ( ( [}_?_+Ѡ`o+lW?WR٫o "ºM]Mr^.t d2}SR##H# D*;ɾ7W\NFAiY)c thK6kw;9iNOnkBB'1*ʹ'5.7h5;;e.n`#ts˃8玵5VmIt";kSkrڄL/QQ&IRcU-GPڬ\FcZXgWt}o513IeնF rsڣ=FUfF6 ˜6g88=EbeGHԴo` B;vx\S5GW}f+%Ind~"Dxl᳓O4@>ծɋ':gi~{[iD OAIvti5ܰ !t*vWA]FGHIkXa::"aQv]JZ{]mw%1WJ$g1=dU.o2,Qt*X[?5jYqwC 4Ӎ4Ԕ0M8M!4O4Hc 4Ӎ4ԌaSῄ7M>{i724YFIIMuf>ț>Ezl 4?C'T]] 4?C'T]] 4?C'T]] 4?C'T]] 4?C'T]] 4?C'T]] 4?C'T]NR]}k{V;o1a32  댃% Z&,be,v0o͏NzQc 4?C6xZgý.utCdg lwt{WT1oO#`€1u@z 4mEZvKA1J<)W^T]hTw7]f-nͮ"-Vh$ۧJf @3\~20%䝪`doJ4їmldcQ}Q}٣k.fM2ΎBXd Ê?2!DFeIs)tho\Y%-Y-]b>cppqZMZskHP.-6ܟ(3ۥiʯ37'C z^$2۠|!k< I=9|K qn=d:?WtTiO7ۻ-  9Eck? x]bPD]pt@Q)dSım9a)֞Ii| xQUM[[?O+4LSiVO?G&Эv~+ 4\&Эv~_tu&- +kݧoÙA?2mk3Эv~+dtk_? irKҚio[qB}9%9isˏЯO?K]̎MsW?+?OnW?]o 7RQuB-?g:iO,A/*;{S$z}!V*!V+((((((((((+keo{5|M̭oF=WA\sa]KKf 5izU^E)Ԥ;/@ HM'ӱQOi_6ğҿm'#}E.D('4IQOi_6뾢D('4IQOi_6뾢D('4IQOi_6뾢D('4IOOi_6뾢DoJI '?OGAHz|GC0-+=4ć`ZW zJ)rD9G$Y?$Y?=CnuJHui_5hǰsNO_5o픚n̍-BJU{q]}{QT (((((ibE!,I @joO{CHv67!rQ̃W A,'9~m?Iӭ❦K"do݆AKu;Au k@Xĥ0~$A͏54h4< e,ܷmf|%A|d9-R>m5{x{{gYCl̬.܎cqVekr8DkiRigAWa]FI[y*4.n6#U9VpF߅.tD mU˒ !@ðt',(A~Xg>߱G,*_}} bQ@g>߱G,*_}} bQ@g>߱G,*_}} bQ@g>߱G,*_}} bQ@g>߱G,*_}} bQ@g>߱G,*_}} bQ@g>߱G,*_}} bQ@T`8(((((((((((ih52º]s u/- ((((((((((((((((((((((((((((((((((((((((((((((+keo{5|M̭oF=WA\sa]KKf ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( [}_?_+Ѡ ?VFsQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@PyXB-1.2.6/doc/html/_images/ContentModel.jpg0000644000175000017500000027043713152762205020122 0ustar pabpab00000000000000JFIFC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?Aloou;ޱwKQ@T(T :U|-A$)6F>ȕAx pN`jq=b"aڢN6'88`K=3SH5#p!54W΄)r8p ֹ=G!_k=z7^][ v/|IUȪvmt jmCI|[4v\m3}[8:xL{WULoWeӭ<1_ugjoz&%=օfo[NifD d*lW oN ݼ2h1 znV6YeՏ}URL)#?z"ZHfm~'Ϊ^@zn";9諙'jU{ }Bio-u8]H2K_1  _~,mfشuy ?fm;/ 4][3Jxz [Tox,7(+٩gm_1CI5TP2I&lz7}KQk9K%p.eyaG 6CdFQj5ŬYX~@%w n't~ߗ3_ oun 5:o];mCX 2I/Y\6gOc7Wi`lC@a@!'?ǃ>Jna{uoirX(dUeܔORw9$׼jl]뒉.?/@hĂ"1/ 9;xab<; N>Ƨy?(9UQ*P03/~? \ \/~(/~? \ \/~(/~? \ \/~(/~? \ \/~(/~? \ \/~(/~? \ \/~(/~? \ \/~(/~? \ \/~(/~? \ \/~(/~? \ \/~(/~? \ \/~(/~? \ \/~(/~? \ \/~(/~? \ \/~(/~? \ \/~(/~? \ \/~(/~? \ \/~(/~? \ \/~(/~? \ \/~(/~? \ \/~(/~? \ \/~(/~? \ \/~(/~? \ \/~(/~? \ \/~(/~? \ \/~(/~? \ \/~(/~? \ \/~(/~׮o*߯( =>l4*{Q;$S'oɳ0+c0º]sl?ȴ}s7"AEsl?ȴ}s7"AEsl?ȴ}s7"AEsl?ȴ}s7"AEsl?ȴ}s7"AEsl?ȵ͟u[F?MM*0LQN2 HB$hUP0IEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEW|@o7@w?Կj+o+lP\}dԴkh8%; ap=Z+.+d3m- /O7%QZ ڢer?Ty~0ևy**1|kCהͨB2Oz\Ԫ`I#PurO+X6֤IYX* ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( .6]_TX{+)#Y*YdzԮO0O7$4?M5i<&Oh(i 0Ƈ&M0$>TfaA}M'3I/K c.wBn-Bv0[QxJHkmamuedw09Q(睯qr;Cu h(jH KGCv\ys.[IqZx{2{"7.!OR\>[8~y{xkS\]4u1?˱!FLzSahkn2@7 ?B+s +>o+lW?WR٫o "ºM]MrEu,{(,(l%b0*JSϡiKs.gN}Q**֢+^X[ \G *#pdt㊠'ӣjp\.pS۟=-dVLzMӦ}c*G8Wv<]Y%Qߟ?*䴇` (^۩SMyυ;>٦imj^58BV<8CeI_q I( f+5BFf 8RA'.ɻZxKrd.s$nH`2b0zVR$+` 0XLk$ζGj],X$IlnT]F(,Y.RERWB gItWg7Q#gfT i ߃kcG'~C?U(`B}U7%N  c'7>rI Tұׅރ"d4ЍBx pH'mw?Q ߃kc@ŕz=ifkh43e*ڑ$eQETr@\_+&WtWIEG oǒ0.*b1#:ou^D ?x#kpSi=W[yEygI5tnoѬLcEsLe1FkFjris 5YK9k_5e۸g=1^i[K[:zz ]4M(I}mmtc>HQ2L|+s (4fD6]Iy,1=)'}i-I91:<I 98>RYz' ]4M(I}]mmtc>HQ2L|+s KSM4ךYh!E[[7,Sm? 53J.=˨$]IwmkY ,BG|iokZLoY] ۺhaX1r2 `E]=KZƿc2 $rp9C=4 ymDۋ%Ee4 nM6s=Gjc=KUmO[{$@ UWfsϰG+N6:\ܬF%&F*NN;A8 ds^]?-WSӯϨXYHQI6w 啰H!sӗwV$}2_:yHRXS2d38ʸ.G]k #?)z+%6o%۴O&a6KnCϵmxD6E5.Vut![I]O]g8W|@o7@w?Կj+o+lP\6}3 ftJBwn=~aƻt z;jK> q$aeܬ`p8l*'Pܶ'mRKe C,G_1ԁ #'U$}Gڠ/nfq$]/QhZz=O131y8'~gÚ_"y<~Y_^ag[^%PN'>o/B9L g8>KЯPmo$*ZdmFo>kVqF1w`FtcP[=oPndkm݁vcZ3>ķ~b%raH2.9YxS]:B_̂+DYd(\f'8@O i)k4;󊖚[ٞqB]@9 }M$&Ku;BgrHbrd\G4QYBߍ-,ڏYvIdA~~V qfHtQaXq*L2p9Zz0y>+^VDۛby^i ´{c2Rhrf)H|s}2K-R[{ Kc1n*HeO`9<3ioȑLw#"Ik+R2ysQ+B"IDn$ŕ ᘝhv L3Ē?ڷv)}K7v>drCVC]`u<+BXȱ[-hfYV业rqL9SA#i/13!ɑ$_犯Ra ^_^Y<ݬccK\n[*ps9M,Wu F s['|tH~ѶgYKTHrU,y%pI jlH!}L K|p:R|m~m6P}0L1eYaF@Ȫ׌m4mA䰿d@"\vq2*T֔H.Q})u*g dԍK]X⹺0Hď{m:'a"p,HX}wR8bNrPxwyO8VFF@ z`9NA.FHK2'v˓J\,M FcLy@@sjik5Pf &7/-i#&*A?9m! [&!(p9<ƽA?g=QEh@QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEαF"vϋ>h> 閾.~U[S7)>Ww\xW_)R_+h/ Э/&M+ Э/&A%Bޢ ' i;13yw9Ǯ6CEs>cCA }:/O?V?_L KE1RV}ޠ(Ox6GZ 4gk8ҟKm44\vSh^c`?HjGW_E٦#ֱ|'BƋ5|asB]c?/N NJnyQ幺w !ANցS б_MG/# m$dX]=@4X~gFigZѿ/&A&g"??s3-hX-OOt,VF8 Zz'u?VcoASlWa}_P u/-  ; _[5tW-/]WQɫ[_TObx宕tz ,3$`UKIm_j ~'询˪-Ɋ+f% 9M|+n;Z>}~ηP25HP@$C-&&DԮBd7c8VE.qgfWn$+k"3G'ƞմ5 fG_*h 7 '8#(E-nHD,y'Z[[&Mw7f]J3/;=OB/;h4O,wHvsݱW-![e/"$_1Y !*AF>7C,/nb,KQ'a yY%[MZEkk[MRM#Jf_ :V>kٳ#y^" *Y N0A,^ҭ"*/uDr0`x;|x{~K_<6?4失IcB d:[/#t5<>Y@y,H Xj+qxmCRgllF_#HDP\a47+m;EpϒIZ[~_7{Z3ojڶi:}V@:X";sg"+ߊ[ZɥyaVxbPnkš;Rߴ̳Ȇ_)PvF`zAm!bC?Qk-=S$Tɥ)^}Ɠ",w:-knLG3y9ުAiޝg- ƨ'2`1>bBwJKռ[\\,h7y^Vq}1ӿ^jx7A6e,^TQ Ȭ&/6A I9?'kZ;xQLQC&bLp8$PX\qZCkxKr-VjyFCG݂޽qV<B"{I);.eBV" +Jj|=G(-X\( q8Ojǯ/n??ßo%A? 7Wa oV9X+B((((((((((((((((((((((((((((((((((((_3SOji*5m[֋ɽh0k t56K#( %,\RO O&gXj" YW0>Ѝr'Мxܯq K/H< vxg%݉Pu%".JH:DfUFm}1tZ:O6Hm$@*&ҢkyP@o R[n&m?flP6M^ܩ3\<`P|NSM5Twrc4^ &9ڸP[gAcJ#.C pM[450ֺt +G bF!#7}g:xno"u,=%$Ucny9M4MjrWZoQMĢ2"#>\WV[ 3Uu(-q`ͫ[ c,HqQq1#լޅ'usO o=8k|e N}p>\o]m%(wjU<.2Ud✶&sQS[6_G#zMfl֦wy-ݩD+*FC `z睙'^@&t_ӡj?6k?S٬߫O1[ƚj.kctۻ=WO)Dw P~??Nx\sҽBA? 7Wa oWE/{(Ѐ((((((((((((((((M[VO60Yޥ0[ElT)BIbKH*&C~l!򳧢M[-o=ؚZz\|cV[6_G&C~lt\躷Zziq3~ltꨮH:Z6_M:^?qֿŗ#"4Y_L6Y_K|h?V( ((((((((((((OoJES\~Jۏ~ݧktkr>tBBiu{u*-gN{d-8YJʺNwn`i0(b<"09P3=8hwvv}³Ms!Bꡎ W.4Mޣ I [[3lpV18լDSJ_x(lGb #+ 3BsnyKd[aržpPrmwE>Շ.Kg6em刉oIrĄ`9qlA" 'k˨-LES ϵSR)?Ӎ\A7 7+9VIy k-v|vojXqGՊXhvfrOZ=ƹXj6̱Imo< בҳv@v9ͦf!3RT##hhi6UıBuV#?t cA\_˂cr wFTH03qKKۋX܀4ȸ| 8t EiڕŤk&FvʭU|ۛyn+1Xa$o n-V%5-GMݤtDBUVGT~Yt#R7:"5' {1 d u)V/n*ZbIq|U\:~ΓPmy"C&<ΙUh!nAh78v4'_NiI{g-|XҧS]E[Vh$k#@{̗Ž̐X&oҫXP`a.7Mh7WSM iymrD eFdl]ƥ' 3PQ:]ƚ[j}Q굛xoS>p%#A¯ӵ^u]+AҴ4웏ս⋛Y 58KVci׉42-GB؞I?u4[QR0( FjCQC3{n$ [,OӿJ/5;H\k؜^ɤ=Dx)ds(kVriW{ ne0h) F w\]QG&+kvnvF<+(Rn#@<fP۰ݳr)Y J]ylҪ'q7umo-ضx.b2@]V,\5$XP@X\ČҲ>y]+B}[LJ7E X#zThKJ;a(#? j^.:hPRFv#4L5% 5vNIF$MtFg"??s3 ج :O9¾ WA\sa]KKf 5:[hH$(H6vɺ*O k.+dب[u6!Y>Ggn+Jq›#EE;T`d֒a+BD΅ĀFGEfW]OR].%kyIV$}k|{q!v{p ,$ƇŒsVZ~4ѝVHpr+p=1OLױ۷,wӢ 9w%󷦆SxFKX]\q1 t/?TZGoipSDN"c O 鱘Kudlo9$ՋM"["q43J͹$(';ǠՑn٘D$k2@eR9C/^$Jr{`9M}!(ٌ*ˌl62;bo s9)w* >RFvӱyVuʙI,K$ 78?t$j i&G2!B,qᘃ`l~Ue8t)Y|@fqTIta˰(ؗR6JPb htSh\z,>Y+nWyˁA5'$u孥ѷ#^c۾4ݾ9KP.8a3Y:] \@fq:TXJlqܢ&$d󀭟*>5 [&HQgbBrkCFdKk 9 <` gfj3(Ts,vN -&nUU &ӱ_uY5IVn2OO? l_M4M5%ߊ?ßo%A? 7Wa oWM/{(Ѐ(((((((((((( Qj'MkF[ ^Am݁ӭ\5h4-Sx;xfG(,x$ ՛cG4o P$dFFqֲ^{[o-q,qXIę98#QKu`rxXӬmqq5ĖIe 1!Ur9'WaTү$[nS3.0~^aGӿ֗NE:dXX2(  > KK%vȱ]Jrck 2pM W6;J40D^b+0pHXx%ߎ4>ݠaxx##rV.҈/*oS}u=NIom,+q1Ha!,Ьe7H>^`m>-Y O ͣ|_UF3 7TW 7Wa oW:N/&]Aor0_3'Ͻz![RLb( ( ( ( ( ( ( ( ( ( ( ( ( w$Ŀ M]s;y_]覠kzZ&r<j OU;G%պOȨ KFߊ~"$qG*+ 2#Sܧ}f34Q~E^:8>3˼ )Ū٣$'%@k`tytށLdX2=h:}9^$&R2{ 'M } p+:a2630 q$׌{l4Ivݿ3=*LJtۦwxGwgfX008;A##8ADU4KU!?ލCb6P'M;Ėtdx l?lN{SC,!Ι$OoN$ݸrCqK :2YeP^0+ԓO qRzzڿ٥#)>fڨrV0ozfӢ=ǝ"1*q(@'Ni^AןSZvhh$RS]<02ĩ?qm(-@rÍl38>ƤLAL+S(NJ=5+h#˅.Ĉrc0B /wSM4M5 4Ӎ4L4L44 < k #?)tGnSP: :O خØ+  ; _[5t7@w?Կj(KP5}ƣk$Ҥzh]ػ&і,xuPR]?X#TՍ2xK(@95%E]7ѵX.QxHΠJ&aج@VSњD7JkwvCtֿwyk4?m& 20/$į0!: K0얷Wq5\fFiUxJ2i=mrm{C}Xj] y1̇2)5oԿuy:|:zW 8~sO)?RסVJ6p_:??^?u^uQN./+.M@Fs2*Nb3g붶& "LRLAEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP1Hn4O‘m2lQEHŠ(5 Fi cTMRDԆڢj&x?9a&[?m\ :=5_iΉWja([}Q!4RM <7@Þ>T6MOč$"(}v =xgCan렠 M;}?4kBӿoN}ƴ( M;}?4kBӿoKV4iF4>#W?5̋sD;wi#Ě).+YWV J(+S-xbQҼ` Ja[?ؚw5%7j>!r(Q0F RfJS[ ؚw4biօӿoN}ƴ(malRwyjj( WA\sa]KKf ( (9ºo]s2t- (((* fOlûod.yOWPUNl۠ crF}jUڮi'ʱhip2e)X\]n?gemuhebDEР+Ν6A 쥮.wB] {@Q׮O-g9ݳܪN{[k>{s**83@d`G~cQ_yQ@7Vf՚xѕAY21eG8*O՝4;ごH_1o@d68H?Bɜ#<1$I*sS6r$&)5^Cn_t`@B(O+j3Oo6qa R\!H[ӺFIX]{B'22nڙ W@c(ŴbYfR[ ɼ˒@9ly ֙F]2!(pdv8c9GOW1k-OX70Fdv.䳰@$IEǖW6Vnz'i [_X+flflփGE{D4qGs*H,N䚫/fڅQJ5-ܒ\x~ $v%1rOYGI#Y#et` pktź^c6-m.u9F89qҦּ745tynl6)h&U!y8#ШQEQEsPXۺ+*FA@Q@Q@Q@r_t[G2 mn%\.} J߈?/WMhv($$T*>((((+>o+lW?WR٫((_A\ma]7Ka ( ( /U%;[@V&,) K :a\ua]GK&ihTU~0ևy*/O7%V;+6oz:AJσf( xNF@85Z ڢvaAU_?5oJxX}D{e# p b: $a@[[]5żN\6eerr#,8JL,ScZ i0·y&[WM P8/#K&2NA, gQZU^Mn%x$1Gsra{9k_,cH(iOh(kU.dfHKy;6F 7H&6@e牵 NQ3HeK[v9]2Q#scj&iu&o(ib &o4){]0ڷ=0'ZRT(*2I#mXh6 Hege \hwB]][h&HcmL OCһ'&܍+}vbXԏ)R(uzv x?_)֤M$4(B((((((((((((((F` ,uImp!'?JI¡ }ag=vύF$Fʑ 9ޘsX㵻F] GΊ,GqIuOW٬:FH<l  h[ɡn6GTc x=)>/VuC0(09g? K%bY062įr3ҠԼ}wsh-/:C #!f ycOTvB.C:)zv~/7DiQʳK dQxWmF>iCdݘgv E)mZRݮ]t2FCT\b.<;$siӬ [Ta!AݑNit%[;pQ66(1v@1uOӇ6jh\zR?/%6~mhz \WwQ|X :SԚem}©sEL4e q<uQEQEQEQEQEQEQEQEQEoOsxvNY[ڇ yȯG[O7`_ ߊ$ЬfCK%(V8YY7` ,q:ƚO~؟3N;]468#(g)_c<ƚVL+.~Ẏj1L';o{.4 |ryFϾ! a.3|]}!w8M?:ԚfsXvV2$ɑ2 '0xRIlnn߾tRW 0 ڮ(Eu o ` E*D/l;b@?VWtek9e|1ʎf0~b A qk3j&isl׺xeD.)qeY{qW6Λ$t@ So[ZqTY4]oK[{(vM 0#G д-ާw>&`L[= (y xd@]C"`b3XY `ti|X~@#6ޥu\{J$JG\%_wmkT6D#+gl`9gs[ѶR܄֊(((*FA\=gV6 (((++l5W?/WMh((((+>o+lW?WR٫((_A\ma]7Ka ( ( % ?Y5u5牫h~ Xm^ kTJ9u _PWeLL&1\g1<}vUN$Xwk$ oRYg#Q/a *M@#^gu]k>+0 Ec9צhޒ١EVQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@syZ襮<RAEPEPEPEPEPEPEPEPEP\K|(Q[읭XUD%x?C|7{%o UZil7@Y}p2qڍƄм$ծ)Dtg|"T`m / )xE$eR;X[_,&/hlgs8֝/ " ]V,-V`)398IHR[)0X$L{Q?Ƿs~os1Yft J /@#vw!Kt[>۷6p }ĨozaU /E4l1_Yѿ/&|oozx@1BJD</כ:uei YlH7QGƽ#D</)hQEEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP\?xkV)kO<5`_QEQEQEQEQEQEQEQEQEW{1y7M>X"# MvuxIk4omux ߈Y 0לm6)(/I,*T"\:㟽vHϽŨ4]۾<Hx=ho!߲6ܳ#8q'լն#.s*ppà ! }N`ce KtxIV̈T:cV ;mBKKx-xPθ҉!n4<1V~unRK_k-l\yҲ:9L)'&ed%9=pkyim3ր,QEQEQEW?/WMk_AEPEPEPEP_W}WR٫WA@Q@Q@ma]7Kaºo]QEQExj7@9TԀ02nFG uxj]{MII*dܒxب\t&팎j/\<~*OC:aH$sqd{UBII=)y Yrk:զnڄMk5; C~ii8ЃLkŲ )q1l 30'ُztʹ $H`4تBpW x+(cFxYdDV03܎o@:^]VS'T5 dBIܳdžyѰqG# YVfHE}fTgy?yI=~[*I*Jb8`U0jϊmm4-dy2}й۟|->X/z%A}`a7nco .; H16Wl-.m4ĝ{ƒi̳2H>W=sZ)!_w-[<&N#+pg#j'5۴YYdJÕ@Բ9hz[a~.a^kN1>P֮Vb^B:(qefm̍Q>¡pFQ/)`'UB&`Ns<{e !cQWikcE] x?_$TТ+R((((((((((((((((((<RA\?xkV)h(((((((((<ϊ:&[kv|KhyVX‘ +)-Kr0 '{zj&T{zj&U} bYϤP;'k5G'k5]?,(A~sBMyƨBMyƫA~`H?ؠ.s^ ?^ ?t`H?أc U5 U5}} b{zj&UͮkLV +c4 *3".I=+A~*Z[hCDc ' #dl(zN59#2PG]rY\ AQT͜ڢu c2{08MIo[4oi r?2r8h6J`w[+;N V(@ I|+i6YNAm E@Pn-nUѽq1v&e+EPl!{22Y*=3zqފ6j0jYW9JEShInΣrH~<<|vsқk&u-bmʹYמXN@+l5l[k& g}vsI8=slIa$M4}Ah((((+>o+lW?WR٫((_A\ma]7Ka ( ( % ?Y5u5xi] SRؒ9E'u` Gsr+XDP2O$zOtYcheX#gծ,kxap\2 .8:sZro`qZ^]8O,O*f0|[x=MxR(H$4U1ǮsXFX0;ΗWOek8Y^R +ɘ3rI|i_FN1 dX9^,ksAjѭgM>Ge{um Cl(~QL8jŪ[y1]DPDRDA {>B^(nk"[b*Ac|iVYqc˹ðyd%|&5j¡NaC39Ȳ^cwyZ&w)1u]#rNO5KGFonhe@CF# pr3ӌWC$D-#{upT1I} <+i3N]Mo"ʫo!M'i Y:o| [R?t;zb#L5Ӓ7 t,$Fc)cpxRTFFCmehd F0;It5<~7s_?Uv'F?XTUhڏEM ( ((((((((((((((((((+' *E-tI熿k: ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( FPU {@aixXذ 8rMuCan렠((( 2`<{5XWBTMjP+_AEPEPEPEP_W}WR٫WA@Q@Q@ma]7Kaºo]QEQExKA_jk s^!#Ꚑ&9?&APj'QߎHMr2NFDkxsy$:֮] HA=2F+)iqܚeEw|gXI3)% ,I$B{Kf*Ws%9uyL .f2 9݁0'=GjI'SֹtMVVP>i)W79`z>4->α$f&RKXI %c+ݵ(r; >c68b;t Ԃ0?r^$-,w9λ.H 0߼z[Ю#6D[1e4ʌӜCRw\ 3PCȯmwNK9.$[vdJVA#>@8=+fM.[pQ v_*Xq)OKq$DlczԺ3"Ŀ6o+:*4Чݖj%Cs[L0W6Q|;Ih.r*'3)iz.RAݏIݻn[dmX-;V_"uDDpPƶ^rks$Ѽq(r@! r9Tm#[S2 v0FpN33Uj3(Ts,vN^ TKYUVX&hoN_5`6vb&ˇiZW}'? L7s2 Ҩ? B5@1BJD</~:QEj@QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEW?O'UZ+' *E-tQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEsPXۺ+*FA@Q@Q@Q@s2t- e ;o [ tQEQEQEQE}_P u/-  ; _[5tQEQE@v++l5PEPEP\f/E15-"P~7Uk.+dبX`խukfr\EH2Kx:`qZR9CHOjmWPamI\A ;TPK3=Md.*XWH.MZ[m 3˧hިGr &3a:RиcLe;y&J=}֫YF]K4*;rI\Qp!2b8e+FY\ŀ<񌓊rG*^֢l^hFM/+ݐ0+^%E6]b$EBC0EReIT!qz5΁5͕wvq#Zv7 w"-^skײE {\8Oe1I]jdP`rKC سU,I'gگJ#<}/Eo羗y"M-;BeӒS"MH؈ HW!~ljX<'[GK L}|Ln~o羗y"7?K<N'F\tOoH?O?$P(hcMƐ4Wq]eT2.$fGrN;gJֵ!;A">H`9UgAYG/g B7?oHq)r6²Ϫ~ے>M CwA*%Y-7y$d6/T~6?oH0xΛy.Y{]_?Uv'FZQ[Zuwr"c3t5 6Xb[I2:cnEs?'k(Q;\_JvgGEs?'k(Q;\_EYOН/H}GsEAfttW9 >Bvl"Ie]\$ ?'?N?$QtgGEs'k)?)?\_G2 3JoO?$Q ] 9p:Z+ sE'%(k(]c5gУ?HfuW- :䊂ǯ^xW\&Whv>OgaEU(((+' *E-tI熿k: ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (;TQf8zdžV[GA;pY o4KkIGnY־ t[~sGA$h6#`]_סkJ5w0ok:I&EB@(p#0yۗY}ߒ`^)-"_Į8`y=kbÖ:ދ]ƒڂwYFN2I1xD5Ia_Fp,w0M}Z: :Wī][h&]KՈ~{msVt]NQKl&h%W*:#k'B#<9w~)םkaЈZ^4}wM9y6 q/P_4E@ss=;ZԦD(+ʠ }N)QEQEW|@o7@w?Կj+o+lPEPEP?/WMk_A@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@s'?*Gs]r5K;o%%DqzdTÎv1%m?PUGIEH1 dV =0Eixhcy6.ɕXu;QC $ Km>(TI2_^xs>̂O(B0تʻIF$$ۧRܬܕ98 i?&[m۸E`mn> L+_]=\En|2*Îyq9>*bk 9V1+FG; txoHAc&<P">>jd'6(&nTmKl9&ᭊ1Suw h2O*Ė1<+yߐe843_jZIa8eBym0?> : MSyX#72m:keGaNFa&9."yCgC$sNV"m=m]\o/U,vc$XJkII[Jda!pI>fVߖGky-«cp Z 1mϘGC0)h3:vz9),rf4( 2@$skNawe,t|бv;j}Mee6iW]F`*H-≢M\X\a\7VzۋNeoYɅ[-;J95<-#apUSoQM%4QEjfQEQE}_P u/-  ; _[5tQEQE@v++l5PEPEPEPEPEPEPEPEPEPEPEPEPEPEP\/O G\/O { nkEV%a#1\ImuY6<3j{wj: VgE+nQ" 4-qKy.R8'ϐF73U~!ɤ^FMXh3or+8 p tdg)*:5ąJs&݈I@ ']n""6|t#4C ▃I-wR л!d!~b2UuKrCu+YcS6=rG̾ڃzE$W/l*E-,mM1HMܭN; !62r:b1km?H55ayCKFYʐ98'yc+5 k}tm[N u'=siIQh&'a7@ǜJ׸=rp|Eew [<<8T0c'n8U<)ZHb.>c74U䶿fDx$Doi|xOc yVo/a>AN3ɒ@Iԩ5H G ۥL|- D_ "EP%Ŧ<Ȳlw+<-I /㵓Qy?VND 79OR_ҍejZ-"Iq-{qAyZi]ZXo S4̒Bc|Ӯ|srZl/.=_c8Lw"!A:”ZS-iY`y\YcV+OjwnX鳥OIU8T3Ku^5oوͳNwrF295= ;kG.zi,DI-d ,܍g< O @RVEWAQEQEW|@o7@w?Կj+o+lPEPEP?/WMk_A@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@r4y='!tC<V^zr_^ks_Hi= S[6_G#zR"լ͘ Fyiw_2ZtE$$nq]&.xY8-=2EF%y3\WYvtV|Zͬ[+3{ ^="( P"Ԯjh.#U3@V-׊t;-8&T?FH&_6u3t[O;3,h(Bϰmuy+H~𸰞REmQY:tۣo<K9j8 6iW,'iy!qhQYfiI$vPd:ih>ͬ߳?طs}+(rM&H㹇Pr  }LH} :-fm-@=/ +'Ot-SG w0'Iᚎ:}Ԗw*$EO@TV}k[<_:ME?2ƌW fQx"D c~U hQX).WW{}Y >PtmSwiw3?G/֢maQh"XNBZnZjI:&NeE(JNGmg~żۜyXǾqSj$Ӵ[{k϶C{Fq@V|Zͬ[+3{ ^="( P"Ԯjh.#U3@V-׊t;-8&T?FH&_6u3t[O;3,h(Bϰmuy+H~𸰞REmQY:tۣo<K9j8 6iW,'iy!qhQYfiI$vPd:ih>ͬ߳?طs}+(rM&H㹇Pr  }LH} :-fm-@=/ +'Ot-SG w0'Iᚎ:}Ԗw*$EO@TV}k[<_:ME?2ƌW fQx"D c~U hQX).WW{}Y >PtmSwiw3?G/֢maQh"XNBZnZjI:&NeE(JNGmg~żۜyXǾqV=rI8a6uS0C@|w$Ŀ MZSᏉ.c:eb{Ia|l>lsҝ?V?_Y̸V [D|_MKm5F?V?_G [D|_MoU-KMTXn[p6r۶}6RG=3_+h/Km4hcB+hGN:jCX_E|_M0'Ÿ,hI4lDՎ :7Em г_MKFVv ? sx3-hUekZ5(cHII?]+s=H+((+  ; _[5t7@w?Կj(((+l5W?/WMk((((((((((((((_Ÿ#_Ÿ#i#GDgUg$"׊udu;[..bJGw*+p@\דz֬KWE`]n]G-&/7'dWk8#ir;VV䷞Z:M9 fE"'PA%aJM=׉k82e$ʑn"{-,jlA?r1J;p.Hi=Ķ]ۡkH:쐳lb~UQ1*O<*Oi LS"l-A9=*{lG3Qǩ VDz%zԷHƥ緌rp0ǮI`VJ.DcΒE I+HnncI&R]\'l w<:2{qٮn1jKhc#yϸd峟¡|9u t3`Ѳ '$o1;bjM$RHޜO\+,A#]&vŠV>Z'Rܖ!`7:1Duv WVHYwi^!tyu y!R6MڷplNWvjOj3j$[c ؈7$c\㸊g#l/?Ȋq>A4P-Ub(6/ $kDԳH֣M00Ԍa/ȏ覭X^3 MBv<:bbTMmTwV ^ڠ?t~>wp=φ'u?VvEPEPEPEPEPEPEPEPEPEPLHb(i\d#ҟEUӥNm:$}ʯUu%[CnVRz΋Q~,pcu{3Iʢ;GR8T?+p7l#HtP'q.q\~2׮!ldnH pxUXb𶘱%I/]2݌yD{QPvGq *cew2 .<$rsG'^]鶉C<"VplǹPgxj<,˔lpcی>W5,ڤB-  c $ pN)}fe}KiRo-yr h9.M6}svOũGa44h~6oc!v֥7b `YWzw`'i#^N5?#_뀛<5CEшEYٳ+[RXճ)ٛ|3g 3ғ IWk(˙H*LJن,7$ Nj'Sm$K+1F63+|<ͩ.7xwLSq"#GNz+Ӷ;U4fx13q'tKa;]ZCqvJB2+#?):--%cB*VN=ꦵqM_C4*/[Ioi7\zf|"յ :O خ (((((((((((@ dNDdNҙR iT7i9 H⦠(((((((((O]8+J_56=(((+>o+lW?WR٫((_A\ma]7Ka ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( CjZMP@v_d¬?T}1RTМ]%r%oH¶U g>_ }as^4ڮgʚ ǹ_ ktm̖(4V;,Aέi-g0[P~)_xgT5QEP(((>zU3қ @2q$5Gm5VH⿶nm$;VEqM] ;ި>/=JwfmfgoI9#۴m\FPpV  Tx:qģzA<|uk msh풙upAI3Z( ((((((((((]j6,5gp m.uF(heS&O"T\&O"TiϾ+5@ iϾ+5G&O"Tz=6_yX \#"NW-;1xƊ:K+r=szIml KXCzKk0E yG'Sg Q4[M'}^h{M'}^?4[4[M'}^h{M'}^?4[4[M'}^h{M'}^?4[4[7tzy>fTOoqJ UA٢((ì]H^o#F@`Ig-u%˭wck4vY-/q1ih1aF0ڻ(I-QLAEPEP_W}WR٫WA@Q@Q@ma]7Kaºo]QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQYZ4xMΡrU_P9f] 'JTWRc23I?\}Z^F,dy^iw=8PhZ1{ΧvKc{vUŠ8U=I$PEPEPEPEPEPEPY:ֈso9mrS=U!ʞFkQ@.˧-5{ek}V^H!k/Z"Wbz<T6-ZIm».:y}GU' tQEQEQEQEQEQEQEQEQEQEs:YaHڷ+C?)[VhwpZ&7M<rp2Oe"FZү,SѤ,N(`qH4_:^$1BfC :z*֕.e Z%a{vQLXD4݀ =I=)QQkJdPaT# SϱBʒ(fBQÎEIE5#]F@8֝@Q@Q@Q@SXTA#U >}-TvWe\(m0՚ خ((!ռaqq,p$0UEV$x4 S f?aIcEK8pzD-g0bXemOUKiol&n`h٭mVee@ p5xtRKXc弿YY*,MҪXv#!m$~mJ-,!Uzb&ݸm~fAgiZ[+J淑#r B]]xFi wlP};A'AWz^u M,2#[ Bβ2FT' oVĖV׉kLXB#9&DȮҲ"B.#|tM(Y*&-bk9 TqO .%׆ u47P2 pv+AoN>56?ydnysv4tNJl"խ؋4Yn"BP<ͻ `vpsڡƺHim))/_r1E+\iڝ%΢KyyV# Nz}ƅ_C*\j(Qo#Px6( '@x;WEi׺|n߷B N)LQ{s:yvo;sڛ}G9_ ֺũdmٙ% m~G!M[W& 3${YC##9Kx֚ʆ8eCv0Đ3‘ԂG5ro6\MuppWbld9V0o4]J9u8^,LZ łWX& Rpq4ŭ nT[fLLمF&PK<_ x-m}d f{-R4FR 區 [ C u{0#+g8>A(c _ )r J̾`zH_y[yy R,O1߸:c<j1pߦDRj.H"J-ЁRHo_]w>"u*c^g;,@ "ķi=N5n2g/ 1lj :;/隆g]~TG_kls;;]B[Y- Vb|7(8VќE3q r ߌ mk:s$+li$),LIRbg"n dE + OoYEj'+ƦL>-S%^Iպy[[Ms)X Y;AgRCZM:Bl"g~e}'x#XZN c(fxNDG BxtKn<;%4e32#lLA#w+"Fs]1׵/ugïj_)k?My6605ė:ϚD2;bC0hk뺏 Zî?)?;膷l5L:Bm? icxYBn߃ӂG)-Y56=(̂((((oR.FVs~#m֠MSDi1cu#7$ {>_&{4g$c<`U^(PhpGx.GI6$ǖ&<C`G9I B~"H5?e%|6'Bۡhfg}@T$qY|+iq3,dd e "02qһH5?eAП/Hw{v_˪|YRrҵ1,2GB?* ͢xnM4G(cyc4Xr>?H5?eAП/H79yMN[=^.mQo1v!s1}/ >&Ev7/W{.  !zF-<N O$Rj')kk]?|9 /'H6

3 MN:BlbYoV}>u2/]MOK+oNk~"y5i퉹Iv>J'9mgK+FץխY$.|ۍOBS߫ŶX.wdccM{JOy /B'@7 GPEOjځOԴ[֒]J wkrVlAr30g[ޱ:osKF4[gxl㚦gfm$-dFt"@26gnJ|yj[n.P v2[axQ[~/?g^^;C]ܮ:|Al-s%\o0Ka<ҋꗳ_C.neB$X/= ovB'y\^ݒ[dD[L\!ɒ&+ |[^s7F=CJȳ!Q˒C,ˎ:$'WA/O˪Eq%i>֡L`oY\1;-{5Q@kǿ+X\5:'xEaa +{[$Bb(AEPEPEPEPEPEPEPEPEPEP_W}WR٫WA@Q@Q@ma]7Kaºo]QEQEQEQEQEQEQEQEx@SNk{ƿšwC_[۴IU v  {V:I+#U{L+Ewuy# u-a5RRcGi?x"v8'@X ک7` eBAN1?],Am7cSF?,x=Tl-i&C PDyl̬fF{SV˚f>orK<$Vmf*qu۔#;i%&Q,<Jdf.1@9Ai[;&I$K)Q|s}sIxGNՌp_{cR*xY(Eyd&DgdC2A1"!Ҵbg ɞSlNw~fÖvM8;Ub6,0FI9ңoη5 i7!80v_3ߞ{~Ma2ۉ<覑At]'%pdTW(O*/2Y12*6 b@' F=յ K9R3RHj7fYjh]d300ۅĺTOpO"y !H Ni? Ӛ`p$akI@I+y~oj|ۛig b f1br<5¾ coیJaަ mk9@FL!͹9+Mm.(W}!(\23x5(l2#q|z ︸Y"9%rےpg`҇r?]^ٮ"G'!>G~p}*H42 .Cy}-9Mn`ۼ28eBPq֮֠u&Fϗn wc>^e=ZBIY<>^{|<rU};I1[ڋxA?7QŸVyJ)—5㽢+b((((oR.FT=!um#s8Lz w6ҴͼFnJP' YJږˡ-RW[yJ҈?xaۦnv5?Yj/=LN`0`yPm`x E5s)P`3!v9E2/iK1S((O1Kb sV@{ s8oUh/F4Gh@& gj_?BTFFi3 J<[hevI|[Cg%ov&ۚOu;n:`,ny[3e*@ܜ~zx%&1%X 9bdd j  MT}r4vkX^KKt F.|`GeoLb>sq{lQ#;27 ?xp99f| eGOG/lĒLyvye-F q"Uk;)K6Vw3lG+{~!먯7:x$,1Edet}Nдl(q+# 3 1Ӡ(((kǿ+X\5:'xEaa +{[$Bb(AEPEPEPEPEPEPEPEPEPEP_W}WR٫WA@Q@Q@ma]7Kaºo]QEQEQEQEQEs~+^xrɮ.Sd2@΢-+cr){ /~zV<& J4BZyǺYUϘ8wII+J8'')e.-./jzb\<" 3c &[KXFDDk#=$ 3ڻZ˃uI'%i-eH9UvPx<zJwN--dcGV8 [VK_4HvIp{ajҵjlk`r)YT*Bİq4GfXJrI A$@HfYށ:2:ގmoa86}N>Y~/id<˂ J[F '#|E[Eq}ZLrygdm+sՏ=e32PFۻ89hU0O>ƓwRzOki$ip(!;wsI+f>Ȍ^a?`/=$uYY$h:Y:}WG)`"ӕ..e}P$پ*%vJ$Ѐn! IQ!nFx(8d+eƛC1 {֛ <,)20kN{37Oui,R UC0!N2q 6;xy^5J䜜ͻEYyJ䭃X>~\56;( ((((oR.FR5θ@w(JZqǀr9һ*)+jpwsVEͤN-fa$d 9$1j宵{`=,3nL1uEk l8U=j9.=ORgӚGe@؆I8<<5Jeňh9y^=]$qĥcEE$ 02NIIֈqOVpύ.l6.L[7K.7J9<+M_U1 Je`o9}6gI%i!EбtpF":\˰$_aaFaa1|g"??s`D6E5 put![I]O]8QEQEi SY{+jt7եx/ pr3HWImsŪ [R[7G@̑l68`qWxm&.eyhm7fzH|so*jD I )NԐBpNFnkD/S$w$LqA1r8:i6߻bFK ؓS4-&_)gwI_ ,.yBsڧNn-MO1$吂'p Ft2ݔWY!7y8o_\}yb4NgCP?)It=o19|MiZ}XKcuf$[<-tH˂lKi|-)A?ۮ^epȭ iFqO1})iڃYRiQM#r}i9Q(m8 RC4,;&o͹6_ ޅO$K;1~z ۞3J|%5b9!%PlFա5ࠊ)mnjmÕ#K,XQfۡ2HAɒI|\kIMkawym#24w{N@U28_QZlWw+,OmFp+Xd+gJ/uh'irDTYL1ɓs+*tzl\\̞o,W3@%9fVB]sܒI=kbӵ{wW'q'W tIs=XBJᮞA?X(QEQEQEQEQEQEQEQEQEQEW|@o7@w?Կj+o+lPEPEP?/WMk_A@Q@Q@Q@Q@Q@9? WUW?xO²tQEQEW=_AaM;Ka i[ YР|,QdWM̱#8=GjDƨ ?W!{W$еUi"+I[8=X-Qa[즴KIci bed̫|Ab) qȗλo BEz0rL֗$6+\~H.8%c8ݎ?]ea4O${»D|~۞3I^hib'jݼVw r r-Dۆ;r*Gcç$6B.v-?|9}:u}ේwMvНG={YS+igN$gF1O/ Y_7$ Nh`~]DžLP\Omomhps=;Tz$g'.ٝBp2.4*Tm,K +1a+2-ZڶKHncɣY>dTeQP{_?HR4ܵȅ6S5@<(HoKJ;a(#? 4S)9nT)0 < A~oJ5ZQݑSc+((((/(/mlV>%E]{G`*FQEQE 00L4L5#ii mj5?A`۟-áxoASlV?'u?VvEPEP-+>Wdcʟ[r2W)cu;O 4s}<1K9+ֶD_U#fD^jw[]I-ήHo2 R} Rູϕ<#$.I&68Ӣ/*N|#CNm4/n'uD_U7N|#CN?9 :' "~?40Ӣ/*7N|#CN?9 :' "~?40Ӣ/*7N|#CN?9 :' "~?40Ӣ/*!W tIp>/Wu- ;K KP .' O»[$Bb(AEPEPEPEPEPEPEPEPEPEP_W}WR٫WA@Q@Q@ma]7Kaºo]QEQEQEQEQEs!+']WA\9? WUPEPEP\4-ivΞ7:90dpC! e ׎9@"V 7 Aӫnfũcn giL  ;>F_1Km,rx%JК7ɡ&c"CΌ+V{5?wy?wy} 斨HʂEHۄ߻-g瞴[sLy]"&I'Wd8v'p38k)+)+m Ttm&G\Sd5st b¾ j_:zԿuyO5c<rR¼o?:k~1G<1g}K>I$rOzC)\訢Ѐ((((#[햶O9Kx &eLl?h)+)+V  ;  ;빢?uOt?uOuEFRf][TfKڼ,wFj?uOuWR٫) ), wy _ _:뻢 ¾Z?OWA-KW]wQd;zuys|6K${aJZP&>ؚw5EgbiϿ>ZP&>ؚw5EgbiϿ>ZP&>ؚw5EgbiϿ>ZP&>ؚw5EgbiϿ>ZP&>ؚw5EgbiϿ>ZP&>^(4U@EQEQEQEQEQEQEQEQEQEQEQE}_P u/-  ; _[5tQEQE@v++l5PEPEPEPEPEP?xO²tCEu]QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEs u/-  ; _[5tQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEW|@o7@w?Կj+o+lPEPEP?/WMk_A@Q@Q@Q@Q@Q@9? WUW?xO²tQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE0M;Fn IPsa]KKf /'T=MG`/'$EPE2iI"5.;UP2I'C3ʑML@ B@`EIE2)c%He]G(.om,0"HZY<zO.YFu)TE3p%P̅HapAv"$[{*>wm=O5Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@|_sa]KKfº]5cFw`,p5D QiZ>XgI0>agج۸o,akIo2UxT0XG]CG,?SbO7TPm}8jX|YaXͳS3ǵ? dH6{v-<)qʼnTk~Pt4j խQx!8X)նy{ ̇ \c6^c} }#Rfq2G23rm8XcUv>6]']22IRP3*8Ycuz/th`kZF*)T>b9l-#`Pј)k򲌆f9s/ZRG$ pFvqD 2IT/9 ﯋9ۣ,))ꮀ9:O12vxⷻIq%p5-dr*v&]HxY-dT. AZBPPFIcu#  yTvK{=F-2;k{qm&'X2# :( 1D}Zob71c#vw` mUylm,A0yF R i^D]XLvɷ;I++Ks1B%E|EYT|D?t[{KGĕRJx^i~B^)}o i~76Gɰg@#b2 H0^K5ȉ po!Tƥ7H }Q&~$>IVx/OQא*H[[hnFVa3BP~C|qcnY.nIa!J9d9r3:x{ fQYH9emP#W/)y׾>{.QF?NAoPF=9Ȩ.i\j{(T${`\Ś=3$KgBqx ,2=j^5і4i#O%) ƧjNZ}^I|H-bgW (}@(n:ڇÍ'R{ֶ}erI6!b/txunh%yK9;'np0N2* 0ۆteYDy|b"<aKMÂ$#+zNVE-0D ͌9 暵hEY.eQl;ֲFp6 ^gG+ٴ.DH[*BqYmYj ΋<^?:瞱K5JA`&/-u˵A0,VxܕٛM@ sʞuZyўfmWfdg49:<+?hڍM\i0+Vr7㡮Tc^g}(s$Z<5S {SN𒠏fs#Z袊(((*ll绸bAI#' $rxjFPU*F={^%!$lTvV eu[QM}=rTyPzsק t"@De;v @)>xFIUBZEnph~((((((((((((((((((_?RU\ov)k:Dޢ+2Š((i@aae\O" j]$¹i VC0m,R|炨ɹ Fwm s[zqg3:2fCaA#G;kZI|yw|oV'4i=?Qb߹n#U!UBl{@G -Cee}4r\Ki Km*SlpT)`Niu6GѦV`/̥sAL mǀ4I=G\?i~oݯK\ʓ8U\,PM'v;Vuĝ?vuw[4K$͵e2瑎 uí"X:$ ˴6oSp{rE,t,[ikkEB gF[:"4k.f)$B6.$gG5'jZ&?b w#oL2q@[i&[[&X _>ǜk2}d{$tFe |`|NJcSՋA" y|ƙU6crsS-}bW[a2H"m#(MȽ \xC40[A?!+c5< k[[/wd6SmpnA#BivV2M7kYDR|h'V5--Wͼ'C*[S$ m>Od!]iz1ݔ۽W4"-Ŵ<{[rr5WHg۷E}23Jh$hbS+]#{js~(I[$B?$Kq]!]9X+B(((((((((((((((((((((((( WA\sa]KKf (9C+Em[uHn`*FQMD'F uaxok&uX&P}mA'9R*]>)^$q-ź$[27f@ԍ:S{ ege{ǨY1^-BKI"sQd tR[_[P@nTz>/bi.J&47 q1$#r"8˿doO4i 'jf {+xu;(<9Gi1-"R<H ]R=B2` z;K]a^^Gr%10FD`$u_eeg<%Fwv*!B=)^ 6RyrQI#nA- &=*D~-%^ ݚi& ˹e>bKqָo|q>.tۅsI*:y(X ELTN/?y K{DfȀT,g Hv`dZM`_֗#V8id2C{4LS`*UӷdsSM&s)iRgFgxKdĜ=^-Njkx4x'KE$]ʍ`0I۵7.1[-Y-xHL9.f m,Üm77-ڭ);Jt.Toœ 8Mh*31y]/OΟae [дLb\2FGWu[rI6±ZF$g >y*s̠T/i^a)F-j/qqcM?t!1=ךul5Xo @x*/22O PSQU[^R(gO4*V mU {[Fj'usGxsM:'x?9a&[?m\ OrQZQEQEQEQEQEq#Ҵcak{ α²(o2dgjoA%BR.FVe7q_+h/ Э/&F [D|_MKm5E Э/&7YxoLY"*%tMDX7#(ya]lo<L9j8Z:Vx Zn/-4hHH|)˜^4 ' h_+h/|xP)qmmsIK)eaY(UujWZZilZգxkK*Fl9 "99K͍#> :7E3xGpƒA`&rHO@9ML{Ƽ}:Ѯa0)sۖii3b#/scqF57c)ϧXE4s4+  9<&-+exYP`qZ&4ds>&UK u6Ip(I[$B)|&SܱEVQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@|_sa]KKfº]QEp#Sִ)R;d kC Ӣ/*He$BXmm;O\CȬe_40 Ӣ/* DŽi?aG'D_UlOu >1/q -W\`yxKTq/tOEV2iIpFݏ@4|q/tOES%CFIVFuPCx$r9>AsEag>/*")ØpG(t:|tRZ ύ|)C>TO ͣ|_UnGq*FhcFfѿ>/*|gotQk:N/&]Aor0_3'Ͻz!\?ßo%A?_ ,QEEPEPEPEPEP#;0hڌeY- ❨Ṏ{w |< ֏Y[>1,̷H#Cʙm3QV-/l08tw+;HS,X8[-Jt2Pm g%I7`7c#oA<.x"YـC!Ifv!Fzu-`@< cbs5W_Ir s NIr!1y z]Mؼj쌅%_cu kZmjm9t%¼[|F6$#ik1]3T[2NO< p8]7t[f~77# #4+^:X_:ՇٷAd4yܢ5s(< HOsxw1/ọ'9"Vnf;u}99%cߵy@#*v$1M^LP$phrGQkkw|[i$pͱ,E1"k/Muo5[4n0bRvAd_ؚwˋ|( 3F:™;m(s؜5k_נɿtMa_\ݬ#\Ip@ŷpi#dƳeiaC8W1W$5<%H҆yL_O]%WM s%ݺȷ;X[INH#xL9N3/Ac\LC B.0Tzvl0ś7uܢy"fA#ҡӒx͉ _1 =⋯ hL%eMG m7+7%NA); ҿ q); ۷pvx}DžG-.m;s#pAHW<95-kz= -"D@wf 2@$2k"jIkmunC L?&y'#Bo!m$*#$<=S\QΤ+rAsNGBx)xK\$ ?&DaʅlIx5Pmx#t#dlp G\]Loj#Umʨ/ 8԰iֶ akR4ho&uWD7.9¹_?RU^wz<7i>ic .cє@=qQ4QgqErKB}?6mo+*SiVO?G&Эv~VGWErKB}?6mor:i[iVO?M>5̭v~VGNi9VֿO?M>1̭v~+2:SQ?+k_ݧa#5|̯O?L>)?+a!.[a8d,0 eNA<)M.-;I4S4BW)).IFX8Qyl+S߱RW2#XK4* X$|cFr$Iu V`)#3$d  s?qm(-@rÍl38>Ƶ')" W (P0,xM ߿' Bv-J`AlDtg|g]BE:Q{:}4P-Ub(6/ $k@07sH+ 5 FjFs~(I[$B7VSx~x5&$WrOk/E,-ռU( de=Ξ0B,2f; z a511oWfזS5Ҙ~h*f~lAT5ŵKæߤRIofw@v t?0Tw?Pns-ߊu[[{yC]{8G3sZĀo j;*Muqq5m$XB;y,uj?; z a51t kϊ-"'}Z\+ͻ7mۏS̮GVр3֠쏘c;N [ 2L}9dD(}.G#5CM",W/k))ofP`g;@ pTO m mz[o(mͶ=S'O?w \̋eӵ=i%b)?49YOеi%WWV('w?,/FU+ tdVd(݌q٨oh[JKy4F`g;@ p08R\| L/6-?MҮctcxTqY3 sH9#v 5.] 4N4R1ii Y"n`_]p ?Mk븮Ә*)-Kr0 '-_}} bQ@g>߱G,*_}} bQ@g>߱G,*_}} bQ@g>߱G,*_}} bQ@g>߱S(U( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (º]s u/- (4O‘lq\*mʹcqxn:vM0HVݪ]Z{ӪJLB(83#az9{dϛDӧ$xc{sy+R%JJʪr`r=Ͻ`}1ەlDh{99(ޤGl쮶F1Fb$q~U)ֱB3*G$NW =TwO i2[L+S(NJ?sxꑸYcĂeB3g ON>}; P^5q 7l th687rx&W0RmHG \  <`?k m5˦Ƴ&dDٌhrYA޺:-PhH %PϏRv]>p͗#߭ߛ/GןgmJ} y\Tfo2@3 G|+_XBh8I-@#RqV݁ԊWf5/gӠj_7k_~}sq\ILŒ : K-3: zau/ug+4Sr`QYVbt-GgY4J㱀t-GgYiеi+x +υ&uWD7.9Š(((((((((((((((((((((((((((((((((( WA\sa]KKf (9C+EmZE;J6olȊѕ_\jVFAbZ_[t{w(U00>Q>^3Rkk:d M,ƃ,pzO<+IٴMB;&y!e$Wv/[MܱEmYM$޸ %bqYr2F@<߯[gIm%\D c=3+.vNayR+JF4"NkdlHH-в,ɾ sn&mwHKh.[U\6e7 C s~hKvTQ7y2)&]C-,%R+HsIqK6a>tŰɽPs$s+fCtvNRq p@\fmVEhwFHween]R|5Nzjǫiqi!e>h==*I ȕXyo{zy&ˍ!^ho#ʈeW]~I.͌w֓k^{A*>H`9UgART\ Y=krpym Fݼ(϶jս{Y$ "pppyuIn5ct5Kpےߓg HzgײKFh@!Ak#̝e..mDA|H@R>ll.̗L$Fx)UP'`͌J Gz^fyE2D+ ,XJ:TV^IYw" QT73'JѰ;GVW۩[Qb>q^a oWvcR1a Ť?z5![ӵ"W{(B(((((oR.FVs~#tƧke iȲ\̱o2 gjoN<%CNkR㱽E`q/tOEQ DŽi?aQb+ Ӣ/*N<%CN, DŽi?aG'D_Uz_40 Ӣ/*`&&%)=W9dSXD_U0_4h045&KOO;ʜk4h0xO}YCl bxS}⩇ƾFVciO<+C6TO ͣ|_U+14X~Fi񗅿e:/*]>ț>Eq\?t+ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (º]s u/- (':v_PI &xȆ8̳.G?7?K<]PO?$Q{'+* |s=y9_ (9_ <}/EwQʂ}/E&oH9P]ƙy"+s/g (A>+s/o O/^4TQ;lM<~;Z(a3̥|K}}ͨo$6s;}6HsJbBzvFVK u`CG TSI-Š( (((((FC$LHWRpEe7g='VݟG#vlQ@I7g='VݟG#vlQ@I7g='VݟG#vlQ@I7g='VݟG#vlQ@I7g='VݟG#vlQ@4t3i~3>r(((((((((((((((((((((((((((((((((((+>o+lW?WR٫((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( WA\?Y3Oiu{ueI 5 ߃kc@w?Q ߃kc@w?Q ߃kc@w?Q ߃kc@w?Q ߃kc@w?Q ߃kc@w?Q ߃kc@w?Q ߃kc@w?Q ߃kc@w?Q ߃kc@w?Q ߃kc@w?Q ߃kc@w?Q ߃kc@w?Q ߃kc@w?Q ߃kc@w?Q ߃kc@w?Q ߃kc@w?Q ߃kc@w?Q ߃kc@w?Q ߃kc@w?Q ߃kc@w?Q ߃kc@w?Q ߃kc@w?Q ߃kc@w?Q ߃kc@w?Q ߃kc@w?Q ߃kc@w?Q ߃kc@w?Q ߃kc@w?Q ߃kc@w?Q ߃kc@w?Q ߃kc@w?Q ߃kc@w?Q ߃kc@w?Q ߃kc@w?Q ߃kc@w?Q ߃kc@w?Q ߃kc@w?Q ߃kc@w?Q ߃kc@w?Q ߃kc@w?Q ߃kc@w?Q ߃kc@w?Q ߃kc@w?Q ߃kc@w?Q ߃kc@w?Q ߃kc@w?Q ߃kc@w?Q ߃kc@w?Q ߃kc@w?Q ߃kc@w?Q ߃kc@w?Q ߃kc@w?Q ߃kc@w?Q ߃kc@w?Q ߃kc@w?Q ߃kc@w?Q ߃kc@w?Q ߃kc@w?Q ߃kc@w?Q ߃kc@w?Q ߃kc@|_ow?WPyXB-1.2.6/doc/html/_images/NamespaceCore.jpg0000644000175000017500000026534113152762205020232 0ustar pabpab00000000000000JFIFC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222+" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?Aloou;ޱwKQ@T(T :U|-A$)6F>ȕAx pN`jq=b"aڢN6'88`K=3SH5#p!54W΄)r8p ֹ=G!_k=z7^][ v/|IUȪvmt jmCI|[4v\m3}[8:3[Iw\+'o'j7'J[ hqyڎ4{7 "n4 ~c o4ң7 GH8+rn- -˒IHYR "Lt(2hn?ZoW(M޴A.bǪj->1Y_U-t_/{k"XhDj2JKL˶/}.vQn?Zoq4x]z&E+Jocp|u9w iѠYfϹn#,]&\koS7KszCt?{{ǫ` Ǫ[[zM>k]J6]"%Y\jz^7Kszӵ _V˫AjݭԒ"@A|fWj9y#ѵ8 *F2q0yl槧E[_;Ct?{{Ǩ7Ksz[ح4d{\12eoݜr}иBlfaK#=:O5k]C\-dr񉜩 1.Tq[_TzeεE)Na'XdԃRƺJC9Ct?{{Ǩ7Ksz (7KszCt?{{ǫ9Ct?{{Ǩ7Ksz (7KszCt?{{ǫ9Ct?{{Ǩ7Ksz (7KszCt?{{ǫ9Ct?{{Ǩ7Ksz (7KszCt?{{ǫ9Ct?{{Ǩ7Ksz (7KszCt?{{ǫ9Ct?{{Ǩ7Ksz (7KszCt?{{ǫ9Ct?{{Ǩ7Ksz (7KszCt?{{ǫ9Ct?{{Ǩ7Ksz (7KszCt?{{ǫ9Ct?{{Ǩ7Ksz (7KszCt?{{ǫ9Ct?{{Ǩ7Ksz (7KszCt?{{ǫ9Ct?{{Ǩ7Ksz (7KszCt?{{ǫ9Ct?{{Ǩ7Ksz (7KszCt?{{ǫ9Ct?{{Ǩ7Ksz (7KszCt?{{ǫ9Ct?{{Ǩ7Ksz (7KszCt?{{ǫ9Ct?{{Ǩ7Ksz (7KszCt?{{ǫ9Ct?{{Ǩ7Ksz (7KszCt?{{ǫ9Ct?{{Ǩ7Ksz (7KszCt?{{ǫ9Ct?{{Ǩ7Ksz (7KszCt?{{ǫ9Ct?{{Ǩ7Ksz (7KszCt?{{ǫ9Ct?{{Ǩ7Ksz (7KszCt?{{ǫ9Ct?{{Ǩ7Ksz (7Kszp ßm'Ioc; 1圓'_Wk$z}iZTUvI>$Ng* `9^:V6^I ; _[5t7@w?Կj(((((((((((VޗUfy;{03&i +EqbZY_Kߋ/GCggEqz_ggY=9Y\x5uez:z9rck=/NC~lthO#WZ6_Kߛ/G+:+q͗#b9kAΦuoeؚZz9rM[-o=ؚZz9rM[-o=ؚZz9rM[-o=ؚZz9rM[-o=ؚZz9rM[-o=ؚZz9rM[-o=ؚZz9ruwoww \H;#\gh^+$((m[^>*6,fyٚGp6ʀ"SL0&J`wZeQ_CDJ%4?M5)—;*30Ƈ&w?1oI!OsFf|aAM/VO7$֠ 9r+o?5oJ  h'\S9QZ <kC<[UC\t+@-oȁ 9P(TaAU_?5oJ+]d׳aZ%q4j3#3~2X`Z~6(^go{, c$ &DP9;\wnA!I\N h'aAUexW]M>Xnu =MmD$e0śuے5'.Bm@jyY&1YK4EUGPCWM\kClB}S72k4+޳s{ l{T* *0Iy^,?UC\KUWL˿b~qc85//c>A4F[y  K]p>  KY*& h ̱”R Q@M@ )š)€)š)€S4S8Q@ ( (8=c[dًUc1eHS FM5շCuh{v!U#&^ m(cxle[ ,BhیqLUiZ~ a$Kwm.șf$`±g*&֧}UVI 1o` \sn嫲X:[skxKkh֐Jd1K$QDcHѿ.x:֨y±_F('oJ kqQˤkI7K r܃oMMRZMު=2\Ym*pˁ8vQ,r^K,ZY%w5(`QEq?P?Xۺs%SUXsH6^I ; _[5t7@w?Կj(((((((((((#x)k#x)k:D\7I-.#2} !I?{<p@{$&5 ηn*"0~dcۃ \V&Ѭ.bWmp_T9\:GÄm;«=F# iC}ңlZر<5GqX]6bA$qqK(#`ua}pz~*om;c lf,"7<.7Z>lIm6s Ƣn@fXD+s$R(qgf"Odff*!s סm_zφڜA sXeRe`I%܍h$ ʼ|vnq ^5_ YeP!)-kgg4 2 eE >eOZ]+&5%ېGySj[7-dIMpI,^&%U1T#쯸s-u(kI|W0Xr;E15k)n䵊VhJ"F7_@@8}6GSq4΁Pr@=Y|? 5]}&"l V6c;I/yEyÍEmXxIzݴsJ,z/:k_t_w7j= -EYuȚn,%24RHD6XwTvXW,GrGݏlwO/ jpg4_k9[Owi|wۂRHg#"Ù/mWAj#KPܱ.dm'휑[ſ?o/#Sߋ _Fw~hj3_fᮖ,$$ g!\r) m,ݤ(YB)Yacz_ _F_ _F6d`$q)h-Ė̆M]O0jDiM 2-D#|X'%j>h8M[d\xbکPxn ){A?*&w^W:ȺKXn6bn'k~sDĿG[@M5-mau2 bEZ[ڳi#wfЪa k9>&~}o#9e`[#>") rی <~0*_%mm~DĿG[@M5+1_#[..`gIDW 60A<5 x$6zy;wQ'\jDĿG[@M5;RCK$/ffkDcy~dHܺ}LF{gW{Z(EP_\|C>yJgvb[d=SЧ??W. ѷtMKԥ幈dLO\F9Ⲗ妒W+wQOY~5K-g6ik,p)8Vټګx{ r׵/g^ԿQֿ$S6q!B|*G&e򭬬ዠ]FK֝asG/ug_(k_)m<^kVytC6n'?r[=ai p\F ҳB5K oE8xS?[_Q;1+(e`[<}=ڴd2;V'Ss]j7b`q? O$Q B~"Ś]ʟj'(S?[_S?4W{:~+!FsSn d&s+.c'nf6go8h.h)AП/H OoYEHW$[qM#/e8F7|>2u6.&wr$PJ! £4TE 0AM[e(3"R:k5tܭjhbNs՝GNڳ3ӰcEҝTvݪ.o5{Z%t8 RH wMDi0(cP pH9OKЊ?[Kris$6ānAOevhs $232hQq&$`݉9$i.K=H%U3Qpmʛ3r,QsjV[pK(_>ο(}9#x4T:tpXhm'd)\K-ZcD"kJ ThP%fd\p/& ev8 ={i*[:cRdk9!2` %H|F6 ƔF-?u.;c 1RG&=ш#VYAbEehY IWݴ,II'@JeYm$>h' &鄍J|v^)2=2[fApIOմP"b$]壇 r{N RA-&nWp,npH OJ=Sw_[5؈Z}#fcNZ^ZG4)l1I `~Y^Hʑ[cK-4MN7ٜ1al6d܎[dU*w.f!p@cӥ FgMR4Eú I*8cԞ=G.7-2C"K%&E#A?t\u=%߇/$J1})W-*V?4{(`| Ġ} ~@3ի=tڲZ 4C39c v5$.'ITmDB; K76Q!,~} }M (((ZY%w5x >/?JkuQE( ѷuq 'u\I Uv s%SUl5֮bU|Iُt1xue-i*0-^i21Ӧ?_ʮ/Χqif_D~$s]G+u'=K,1+ >_qjm6sq56GjSf{`!W#nl֖Oܭnu *"R tԓd <=hGRM%Rɰ IR:~k4m)$P[92 gRmgTYnml%m,YHczUXu: 1.\ҳ|?9J؃Nҷsq,{TWF ڠuQc@NseŚ%Hr6BIvsTtj)X '1MQ|fHOȌR^L72f-7 Ձ]r(`:(;gvxJ7ѝ ce}GIsvzZ cWQ&wۻ{F\Fڲgw,Xw+r)B*hǙMwGGȊB! j&7uZ>%-/ij4nm<"$f.S=0 V ӿcԼɋŏ.2.ݡyqv9Y0}.yot6^I㯯Wwxº]s u/- ((((((((((+<4r|:hZXˏK2z<<3[u6.:Dwv!vD+pr͓sIK4eԶ2i044m92c b@$Q'v8HlqO%b87Y& # `\|~9>OǗnR$~_m]0,嬟iM=yTk:] ƥgI'Ue(յĆ[k$}=)&NN^x8 oVG^I4[?lN2C6HNu}5e&mP̹FylSVL BnLa}i]*r>&H!=߸|H!́ |vtK/I"7."|D'lVtdףU"6>#d7A.hN6CHM99MI'w-h oĉз8D챌ǜ~|sЧ8ӠIi=S0JII$󍥣GH%x4KV:iLQS'bĐ)k vnWS~Ϗ b¿1"27c2 2B۔3!$ pw#g[>,<+GĒq n89c4A}+fwvP*[CKd4#!b#@UFNB#o]%\ʈQ['H'X8O覭.E54'u?VcoASlVAEPEPEPEPEPEPEPEPEPEPEP_ |mۿ__k u/-  ; _[5tQEQEQEQEQEQEQEQEQEQEWbQy^[<-[e%@>Rkѫ<5s-íhmeu-EAṬgSbniue a.O}h}ţU22*"mCKKy$@9mfϭ.q-\&GF8`S+kB*NKoSLЛyӾO/y{#jPI nL!'׌:ܶD6i0yD߽ߴ79ŞQMݵ3f΋o/d|i#2zՕ0BI bO b] gӧlUdVsCJ员e $9ƒ$йkU&y0Lfb{>\ǏR[iaxLK7gܖN=MU/Sgq~ӈ=E/ЌcAtB;;m.k-A"|&#OL? +$}{2Ė"IJIw\AoF6Cβ#q!P$Wv=N)x{M"9.ys*ɸ @wݝ=Z*Sn^=FV6UT Pe '!6{P*#ybJ}M]F–!HЍBJI9{jBeE[ X8,qn4{ Nd6bxn1.GLNa;K{hF0L|u+"9`[ 8p] 8ԚNq濼b]xN7x8.-#ۃy@8_k-`C I6wcq^FzW,+ *ӫAq$NܬqX2ѭxt 6K;Ӧwtt![I]O[(((((((((((+Wwxow:WA\sa]KKf ( ( ( ( ( ( ( ( ( ( |"7m [KwCm|IR/2Yظ08pUCU="m?KK#@/`mUvϭ;Vi9bY%>[jgX ~l֫\yKcv3S,.2YYLD@sٲ=O> -h.-u &{-bp͓.vFG=tMbGXtmĊ,zS#zUo3>nJ64DP"ʰuP08Sl.ⰶ1Hn}1?i[(10+Į[}#iڎbhZtuavYm:EyNI[cd, n18""E >\1qr@<O1ܖ*HSe9cXv}^Iͤg<9³PgC^at؃FlIm(y8Kr sO; mVV'ikLC]2XoHo9錊>h+nhǤeA|պKwD6y *l83٤F$ْĊ+F3W8R/v(&Gvi-̶̛}2s\ҍ G[UfmźyevsZ.Õv3д{{JtP*[`@򧮏.f-6Y1Hy v#anMuˬvwY䐲d pzTj{YZXٺ$l=ySս牧2Ek+D^9' '}1y?9wy~Jkko,pC<4+FsO*gʿFqj wp*ӋsƸd'|f5VIub "\KJv:/F9'>ƩF]_K29=qUntO8Vy'1DlfIAiڟ$t<#e-M+3~{ͧ/<-7fT¸`1]::a@5O8yFeݷ99U|SjnyK29SA*s_i_#i kVC1?!{oZI"7.F|7JB~a{b~ ĽPqdqFx$dfF4帞 hWϖx6 0wqî {HE>+ onQZق+Z13)fTW,Ô^{=ZTsvk-S m:7*3{cDƒ #T٢uc s}qEL1yW"!f|!ߎ|7Z~>!l.~Xx$g't(KB)fe@gnI=qOQmἷfJXsG=9Cqqw:Ps=4TF%R[GR ZX9EO42}P |[y sC-ͼBA4 D spyɫɨثZ/bYT`|?(֓w_mt[Mo ䷉o/#یB0vx#,ס5fG;x0*k=BQH@eue H$ 5THx8UJ 07So]sS+b7 ?B+QQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@|JnO}_ |mۿ@O7@w?Կj+o+lPEPEPEPEPEPEPEPEPEPEP^]j?iWEŭ0kFRU רR[A3n`1@N)4ӱ\ЯO?K ] } bYϤT!3}gЯv~YϤQ ?9s3._Y?/%Эv~YϤQ ?9s3c? iA~`H?أ38L[Z?/&sЭv~?YϤQ ?9s3ok/ iA~`H?أ38M[[?/&Эv~YϤQ ?9s3 %ׇ5̢w=_KB}6G紈sU ~Q`:ǚmTGڡ<$cv`{7]gm/ i__ ?>g>߱G"frKB}?6mo} bYϤQȃ&Эv~M[[?u`H?أr g! +kݧiVO?],(A~9m/ i__ ?>g>߱G"fqI{dgPv3Bkc*TdQ@Q@u=OV?6iivZW2HUH>T еkZNkIi b弌JʘZr0~c>57BL+0nyAFoO7m?o J2[d 1:D#ss-hENqC,p%*ƌ7.sI'1T6~4i')'`'(uI|R1vM!NN9"CB?*S9- j7df~s~=*WoH}+ľ/{+YƎqV\mh23Ӓق:($-Uf8`F1(NuCS\AL9|{cPHlyVynE=wI<;9S!L9U\NsI{'(|s=%%IB[ _ʥVAQ@N=KP.E5f9_ 䊧Xtˋ9aFH0WRFp})r+bdX62R0+V (((((((((((+Wwxow:WA\sa]KKf ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (8cXӾ /MCʎ(^Ws$;U'P=*.?w\w̰ y2dC.8*9G"֝#+u'Χ[XhQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@ο{>}+́ ')#F[M%tHA>ꞹWiujCyjirh$vq4caqKzm1Sl&mq$f&\)|@56w:(AEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP_ |mۿ__k u/-  ; _[5tQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEW=/=_AՇ ٳ9?膺.&Ḃ` Z*ǫZC@( QEQEQEQEQEQEQEQEQEQEIDal̇Θ_"? iZrڭ!a"D?V5EPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP_ |mۿ__k u/-  ; _[5tQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQExO-OH<>TALɏ`mC\xOHḰ?:h(((((((((?\arwluY%`;}s0e-:z;f(C1 [h!C kj;(-PEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP_ |mۿ__k u/-  ; _[5tQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQExW6)F!] U"4>qnx_R^RƟspҼ.d%$ڵkEQEQEQEQEQEQEQEQEW=}h/o8O1kb#ut^[n~]H좬:tZFeBIIv2}3@(((((((((((((((((((+Wwxow:WA\sa]KKf (03jWspY#wl]I<? Mi\+ Z7EҏW"j9wW _Yѿ/& г_Mw4W<OtoxS"hS б_M; б_MvtWOX/&x#+G8rxO}4_D|_MuW$</OӇ%B9ÔW Э/&A%B9ÔꨮW Э/&A%B9ÔꨮW Э/&A%B9ÔꨮW Э/&A%B9Ôꨮ9'ॾK#J(sX~u? [D|_M>p:+_+h/OFq υTgH3pTIa֗AwWg/CymH&A$mʑ\,eΈĥݿ8.OSS * /|Bt+;{$p@##v8>» (Q@Q@sG[9?&?t5j_>3ѯzG{|62~\@ Q@Q@Q@Q@Q@Q@Q@Q@Q@]K8f0+k{AO׵\r@؇;+?"(('6^I ; _[5t7@w?Կj(ß{a]GK&_Ǎu,{͑J)()E 2$)b#Fv z*I4( ``P78zUZT6| NzkM$ĶBdi-d$ѩRF-rrs [[=2GFWe L(AI8nItIUk~RFsdg#4],psx+SPͮ@Jy<̒!JʱPUI o13 Egyq0v#.S,\vBtk &@. #xG*Z/%<sJ!'#R*d܆9\j>k6LA$,K34y.B7EQ[ƺ|MB(y5W/ G\y[GbESQEQEVFn/"RiԘX9Q/ 鮋"2:Vz@r$$du :zus v_ a#.$ OR"bO7 (((((((*.jNŴ A('x;PtaȸSe(-WˎF'P1$z O&k%hI! $n 2| ()\:z0 _xMHRVM2=1ޮ^:5-CVYihYb$kvolrLq$ ;^aoM4wQ{If5j 2 w>g|i5i!v&26iU F")ekEyԞ>MZUM:yceQdPyL$mar0[Romho594UI.6:@yR_?*+|;vhZZy"+kԅM,%\9;9xVռ<\X9KѤ MN8#(O>]R]0dj+&}z%QjQĩ A**rH@/?go @\[2FWpLP9@4S6S @e#{C?8ݚy}_IPb.5&d rl[#לOw_[[\ccȖjG3msWUUQ*P0Σ^®*Ƞ,PA=kΤ(4fD6]Iy,1=)5f USh;i=3 B(fZ|)\8PSNiPI[I.Mt vdޤ]Ebx[TtP{]Т?!PIb2&FQEr^K,ZY%w5+Wwxow:`}?WR٫WA@p ?Y5wU>{m ^Ԯu]CC%FKUn:rJTw:J+k z]SYb6V7Oo,:c&.T#*Yڶo=FPHc{2 nv*Bl/Bl;wD=#SCHȘAa&vatǿno_:2 iYSvHT1>]׵/g^ԿRֿwzXV_׭-Z%?o+ObcǙ[oƽУ?Hoj_(_) MaӬGK{vslʬs$ޱn }`s Ɯm9\SУ?HBl"]_6/7[ӧ :ϝW 2^Aឩ4V=[*&X]ї@ʪGfk Q_(k)6+/ùu^1ڴ ^VYܤq;y- "y6E\鶐Mi2ߕ;IUeY@e$9tu_x}GHuIql0_ۜe8<{կC<-B֍54[ Z7E_to)k_I|9C,~~^)x_sJ"B$`bBNpJ)EsxK(^hRbOoxF27vڻb>@:myh<[>[zwfB憋k8$M 8K;!T Zcej싒 ,MZVþOѼ7v# 9MGW/&i NGW_H |eCkBRwX2}ց:}՝oC, T<~V#Z+O>EܞrFV2 ' h ' h_+h/7Еl!3A%B`oQX?Km4/Oz_+h/ Э/&'ݍ>>2 nN8D(k( rsX_Km4/Oz_+h/ Э/&V [D|_MKm4E`/O?V?_@<ZY%w5|;V!+8*w+Wwxow:`}?WR٫WA@p:iZʑD^I*dܒzW}\/?ºMQ=/XmkUbEb982=C8=*x#ʅv$$I'5+.*Idβ~E͏Zd(`8ki1”ro%LvF"pKg PY:L\(|HQ)o0䜖99Xo ƥ~8eL{W9`Mƪ3E_\M;\l}v)\0Ys[gB@g x8'_AFwL:$2ǹEm7 -rDV _scn- ~.sJ=wO{"YQIPK|ڙt"V*ֲ0c*r< Qo福}̖7v-VQ銋LޣN|"HeWhA@І݋DWI^gVlirN۔:ZWǦ[Gut6Sq嶱'=H@ [Gq,lRڤ n Wp1Җâ>$`Pm!c21`b?!aPIh,c"X</4j\xKdVM[ E'U!9|})w-oM sEUe!$*`O'sL1@Gm^ZƱH(ʤ<޿JH<2ZbnKx1Q,m%d0q4N}KM=-&34C-,Pn`PX nQym4sf88Fx>w:VeKD!$La*Y )gi5e.Ѭ1C嶃Nwa:|̗v;v]͞8QPGM2VK$y JonP0s9֗7^dMu6fp /x@sUm#64-ILyqF?,h:҅mACj{mfg$F =>#h3JL2Qr Sim>yp9E :(F0C5w:VeKD!$La*Y )gi4$Iap9D n#axwN\ƥ" 9w HٴDi]5Y'KrXHEk6/# SkV`ǧ_Jc-܆k2?y F Ⱥ>i'>`pNqFn%mu$`\} ޫ3Ͻ-坼ie2\v'#+t}BȊH<|޹jk6qܮ'p۹\+m> [?)U9|QLF%$N)bJrqJ9bfBkwEqeqmѼIq<`g'UCxYXkIU o v /N}iu: fM yKO:MIg-ey³dDB7L0 '<84 qoyuw4jZ-bۇegZ¨y6BTbFwY={Fѝgc$Fb6Jy `sUKDӬȂfvkyp'i4&}t=QOpuJI| 6:SiZ#è:>^|+ն+YF2RːHy0FASW&M[{ɧ FX5M*vH)76x՛>$;Eo, xCa;Gٜp)Ÿ;&7"mCI٦HYIԐ>>'.2 8 9;ÚhNJ*JV)RK\jQ+$#UmPJ3uTQCwׯQH(((((}j_d /ԿP+A_ |mۿ__kº]s u/- +Ќ˥jI%drO&@8ws1sl\3!X^)RUY392BO@2jkcj+t b@29+[[&т0Gp[rതQ+3N񎧨 ,)ʁw 18ʌkovЬ0ׅQANxďu,ǰhWn="Y^.$@lsXCoof8Wjg<Ēy& 8RAJ(TQ\E;̑Z NDTQEQEQEQEQEQE%Bo5W/ G\y[c7QEQEQEQE=Rl 롮{趚~8:mS9I4EQEQEQEQEQESe!呂ƊYu4d6\duY`q _FLg{uCSl_ o*(UUF(((&F_J?#`ƻL'-3Y{WQO'jVCˈs3kן\Ջݗt5b\xZX\!i'M* Pd خH k}"q+( 49U`9@'kjj/hV-qDn*;c'᥸.nmFᤆKv.ь@1z8?[ ٵe-yfy'R*=> !i˶UP)1z3mJjPI4tWY0yp@RAtTw u%&)R~w P_]jZĂ=- `/9uޡirZKwK Fmc9py r7,&Ӿ%"3RTFF\УҠ.$˪ȇdgZm~"h VؕE,x䎧4'зͶ_60R&9;R>hs-5:K&Q}ۭ޻HrFU[ꢲ \VbH3tN1T/<_w/[Z`&@ I72[S׵GL&(.5m)C+׎DGOkh7r-6@8ϾY*p6JӅ6(h(((((((ZY%w5x >/?JkuWk+8ddSjiܱhj7VC*Lߚ̳P#ZQywiZ$:T2E5̆w݉$(^zX7H Uv+aϸ5 Vw2OK#v Bهt&Һ:LnMބWFC\Ƣ#P251IMF[c2L؜eq|v&!rſzdUAX~tCs op ǿ \t~M>[=2Y%Ĥ,[2\ثo-A811<'^sZzntt j,7F[*l zOaG*.y_c m8T EPEPEPEPEPEPEPEP%/ԿP+_Ws[@%{]'>6^I u/-  ; _[5tW Wu\&m+P:G)5"P~7P*'Qڎ46FpԘYz$:LSK쌩qIvL+JAMe- FP𶓐+n. .U1$BI~f3iz{)6v*uQݴ8m:KTYBx{&cGCuZkH2-튫ahb;nfy6)f0F~Ǯ:`Voq`a@^M5>b{ (]VIm5 \r.4F28ю 5Ù=ZAckxFʋJ@O*G DEKټў߿XK_)و T='"g=eEL8v7HCgh8=iYxFΒ^6[y#"9]ʬ^GaI%af*#  3Z5Wc~]O@qX[.ۛ, ټ=i$p8ʲK,JVb%F@k 뻭#(G9,wyͰgr2M,# yde H" n}Iϥk[2m͠鳋2VY9]z!b:SIcml'I"x;1!<jCw%Z[4'ǟ65k}R[K2X;X$*~pTZ\95Qq b 9#=*&{c#_#ݍn83X^[O ` +dr 3qx hh#Ru9|$q\_א_s"YЍۭ)jO9z]G e]9dyTzAӢx&* 52 ((((Jak_*ׅop)((((/h#]>Ow͏ (WCX3džgKM:_O_n"KIGBC@(((((2Ộm[+vVIX oE5km6 HacGe~Ba].ˬZt/(vQ~cQ] QEQEQEQEql~+c J3;n+[U8s5?2y׽%*GmZIFX*;>ߊ^V$\Dge-B!M{AvH8EMIgj41G^z ӏMۡ9U+9Nbp q/kW3c@~a,U Rilmټudy嶡;S=ʁH<7y&=DDan|zRJ_R-3N6٭ǒw\u rjߌD[O +#Y=…A|l[@ ۲' T$9WG8\DM*@`7)x_I 2(2tPF~eyӼEj܈_$U i $6'QZV{6G_;!s9S<5E-+9WvucXI=>"Ya[wv߻c8+mO^U߼-VAЎw+5`j-ig(2_ Wq\ i[Ň[ZHӄ}I$?3HIH^xOŨ}#3cWl2@'kz\IOHv`qW4 {0[1+V/1<J]c_*cHV-.Dh8VP8sMp[yI8ۋl-%c=ea4O${»D|~۞3[u ේwMvНG={U$5-)O DywicC1?6y4.^=mI7CAU.A=UcVKN=>h."Hv0 f ֥֟_I]pK,l >6^I㯯Wwxsa]KKfº]s^(8,Bl yٞQ>ƥGfޮxe ;l[h,k2w ~51kf: P̻gEc'oʓ(:T6wtW,a(e؄y/'*64_њnWV0;k(MqGڕ``!,F1 `j)EqrV -Xl(nAVC=J Oq/*ݲ'v1\8 :ͪF$y.aKxI2ĀsR0{2@iV,iɈU7 Nwy"5ի4G6 ;D$HX,nW.2vvAyE.i ڥvӜE3 I,NQ[xL*-c +QP;³m3{gfP@J='~Qr=̖m'.l+d` u2Qh׹t ݘDZY `2 {ՈmgdyyGCҹ\oUH.eZV)";mbӴR)bf2Y 1^Jێ qK# I $r1`OSޫ Fhfu{ W)2{1ҢYPaS\`#.92k[RY<,E&#bާŽ0 'I|(X̒EDcuiv'zuOkFnm/egF|a$/^q~:bAs/Ҵ,AIk^RV:XmgdyyGCҜVX<)VT`\ 3ch>#jOK5ɖrTٌ/'mކZZ x;w9%2(,.Sldc^yc?2I<k5Mq, "h`y_oSGMI򳍄{}Si%B]k]ޥgnwS;y=pAǸmboVn#o0FFv=70k} |V9b HX8⮮-Qb~SH.ЁHJ(jMϷhgK%Bo5W/ G\yZ`{QLAEPEPEPEP]X7P)A;/M%LQIVWA\]^ϤwI((((..۫p Џ˶SS9 ]P? ϫG{x?\{Y] St贍N dfPEPEPEPEPg{H  ڍ" ^uѴG 'xKc#/%V3;J#m'8^&0^EטI"n\"G|F'lWP*DO"IأDq kq^C캧wbxͳ9 x5 yȺ;Ig!PaFH }z _0g;sb4ۻ Sйg2p#qYw G Ʒ汈r@ W0zn*5+2wDkKv *$;Xظ%B#*1gN'ĂX,D[7}NW{xMj 6K'iԒ3Hf\"K9cKϹ~B űy+<Zks`^VGw*#oSxsMZUӡmh'nssE[TіᎣ%0?(2qnZŬjqoIKlIDftHϕ߿ص&hc-RO*7[!5.^qi@?Zqxl>8 ף&OejC ,P 'l52k;yp2pAOq$1ʤr0hc\ROOTcV% G3m>_r{9cUء;e2I+lN0d 0_~qW$.o7J4T _9'Nw,[;;Yee#8 N*G;"!%8Q{t _$* B(((((((K_Ws\7RCK$[|JnO}_ |mۿL ; _[5t7@w?Կj(@.&XKoqwsr&#~l&8J﨤57<ƛyz%P5MJ`fT]ȠFqg-J}.ݑp1Q.]2>zJ g<[AMdoO5οᙵ]l'0ݘjC,>oFj%:]jW6};l-Rew9l\ch}j2د{z3|6qI{'+Ib@q6EDk, |#(ΖNtLO7$Ri'(`%ǃK[CizlCb"{u ȋB?LŠ*QEQEQEW.,nΆ9}j;OџKͼ\3}搟OV9Y=u{ALT?0[ BT9Y{b:yf/ UfK=Af.뢎8}b7謍#_RK){-R5n==}@Q@Q@Q@Q@Q@Q@m tbAL/2QC@Q@Q@Q@5It}Ru-i@G8G5X!?<~,X5GğچEк(0䏣WC@Q@Q@Q@Q@Q@Ts JCy$`u$$<:5u-% Ni!91'|{#= ~~ߖӴ3e./38፽Cw-5Ie< q@=A9RWCNS/<4zMwFީ]]Rt}J\ncv<1ĒII%d (b ( ( ( ( ( ( ( ( ( ( ( ( ( ow:@%{]'>o+lW?WR٫((( EQ: P ݷvWEE&%XUVԚG>iB1#Q[h>'УR [c1u0o"W-w^'J)[_kB4VOKiay&LXl1CQ+Q4Yga FK1|Oo$VZPҲA6 w B‰g$w>b'U(RXbI)Oݗx_B8x{yY$,n {st!+']WA\9? WT AEP0((((((;W,c[4- [d7{pAV\:2Y$k) ,Y?cЂvKL!xf$E* =A\ص ZKhi5̞?Zu;=^n.hXR:ʰAQ@kXivmw5ZTX%Iv*_FC:+W4oKԿ۞*2 3_FĿG׊_FQ\ϊ_Fgt_Ks 'w-})?C\n?m&NA|ļR{֚a)}i5W^Ur1O8,β|[@2-/_E\_EKſ?s/"̂(oKſ?s/"h9hAf?K5@GBǙ)R:kź>-[H'if֕w#cr< V_EQ\_EKſ?s/"̂(oKſ?s/"h9hAftW7h9hoOȴs :J+#ú>xI[xBx UIyQֵQXz+HolVz<>Q7asVl[t除AKY@98T5qDHmDG!=$q|7U'@K/gkZU%܋dkrzO5@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@|JnO}_ |mۿ@O7@w?Կj+o+lPEPEPEPEPEPEPEP\9? WUW?xO²tQEQEQEQEQEQEQEQEx}j4cգ]i#gz~6"{GpT5mZXn94lRH_#T>M^ò-MdHXuP=8C< _DmkhdA/GtQNN#)š)€)š+͵ظyү9c͘(%I,t8j3^y:?wQE~K(mhĕ` yI+m&+y,#êUNrzӶIgL)ª޶ g-$^:mm95OumlwZ_6Krn\m<\C{^*okV[M;"S`~~^3mޥmk.R=8.I#1-\+muO{нٜIi I$,Dnao USik[ݔP$i8o_zuWZ#vuk[KưX˫°rf|W(^RG*K,6@102N[FVW ]G~'W]H>#1?x3"AEPEP%/ԿP+$*b$~,.Bo$¨ [NK uIcmRh2m0A2z<7t?(֗Yhby,Ē#yf=UDTE 0R(((((((((((((((((>6^I㯯Wwxº]s u/- (((((((+<'aY? C! VO"(((((((((##d`C+ = :MbJTLOX R(̶%c-s8Nxx2ZZ'omY_0s=qe=ˎ?&Fpfѿ>/*5."{-ճ,j˃lA?IFHfѿ>/*7s\xB%,PAl[œ)h?TԙxZD-xn'm̖0F G5Oq&Yj8'@=Ȫ0N[#n24!U$NAy5Z6Eʼc=ׄnKgv<+ZRH2 H p{C; >;+[\GM 8#[#D_Ul4$Bω$EIr90aq/tOEQ DŽi?a[2\E #mi|N ~U-`q/tOETW0]ݼ>#&E+$r_B@ _40( Ӣ/*N<%CNޢ?xKTq/tOEV DŽi?aG'D_UoQ@ ZYYkxSu'8I8K_Ws[(EPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP_ |mۿ__k u/-  ; _[5tQEQEQEQEQEQEQEW?xO²tCEu@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@#։`iUky[.̒?vqq֬=h ѶX._u3#?{8+'~m |ưUЮ/uH.evf%m#<Ӝe\OeMsIkq;O\E%jc{9٭Lዶ{C$οkFc-|dt`jWBmbk+ۆ3&An9 [`OE"+RP6-|L `d䞝Z#( bE(EY=D)aUȭ o BӴ,/, 7R*] ?>xV6ws,,ƈIR݊|QxN!A$pvp -;fsZzd]wz|Bo HB:Fbe$!0;e$Ok7$[idfV3Jyګq"J-Ȁ0_)d*߽34o6cso$&?5Ws[ /Nw)&SJNóÛ9 \eeSXY@l^̒\H@0ɭguA(n^faf&A8ztjϥHs͘>Pyl;{7RNZ?PWO̵-]1%jX6s]Erxi:TW:fGp,b:>m8*NxL8$ TxoAv @7J3+sAD8+ovtV#w_)ђYW=yafƚmŔrG0[¾TPC>` px? birsW::+]76kp(PF+lҵ{QHaEPEP%/ԿP+_Ws[(EPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP_ |mۿ__k u/-  ; _[5tQEQEQEQEQEQEQEW?xO²tCEu@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@#։`iV|hlsLqUOJLv2 ~Cg>f7uRl s^I*$5J Eڄ[a lBtL;N$y9ZښifI#Dui*|**iO/bpznY]N1VK!yû8ݰ O&=y>omp}>_܀r<$U82U"L!@b1qv3{4A[[g~t~8s_^XLPI4eط¾s@U[,lNr[aH w俘msec8G4XȨJ;!-6M*aQdKK.$V@#f<7YO?Cmh(!ώ|mf>CȢ*DH$I*O5%gl2FC,mqw,[i^ O9}eͷW[߼1z-߈,k/2Mp+ں!oEFIS=Eq+ T$I*đnS[c Î"- $N%&g 0O,tryu;b.Zr+ xل~Qě3q#piPiqitI$2$FFj lr$|4䜶:=ð{uH2z)8!~ct$.'ITmDB; sMψR om]nM<(0>q4]xL.\M4 _,lssNh4zDMUPw.NpܱˎKZ=i-IP>XLLy*ZJWW6NqSqbUԢ*K9/֥_I]pK,ldQE0 ( ( ( ( ( (9YZjw[|SF$d ¨x["kS ՁYOr㱌<_toxS"kdSE1G)BƋ4 б_Mm Qp1<'Bx?W?_[b]msŧustPwPJnŇSEX [D|_MAy/iS]xkDPx Xˤa%{qo7EPY``f[/ew0inLm d8TIH+eI^W_g Э/& Э/&wPk]dH%dٛF@B .9$猛\[ŤЬ+B#f2d=e}Oi3xkD2HMI?AUtzCmm9%U;#ٍ\Ea\LO/n{HU-?+(2]x2uTkoΈF@Gq!!*@#%-?V?_\? i`t=* Z|l6GLA܏Z$5ۭw$(HOmt@N#b K>ki ηmq#[Mѕ,vv;jwuG6^I㯯Wwxº]s u/- (((_zn=s\QpPcՈ}j'Z/I{ƨp!3\sG?N%#=oa`X%hI M*':/I{Ʃ9ѿ疳;5Krr)]V;5U1J02|nBrm K//U±X˩X]6?WX,`ؒ*Dw%zJ8$~5UYoN/61s:=}3NVgsEs?Q >+\&O"TkϾ+5Eh{]'}^?5[t4W= >?Qp:+I}oWjtRYgtH& QW `Ҙ(((((OJψ\r߽d.?5OJ[jyI3g5ͩjbj:sK$kAydFEBO8𦦽 Z[lm*C1ŽZt?mYyBݍ6qHh8KX .dA84^vz_jVB&87h =2G>u}6sn!-$7 L9ۃccOfhiVtdWyvQVَ*GˏNҼ7q+ wb Q K,Iz]F:&4uFUN >Qu)Vu;3;GBuSssJZ?-#NYPdAWY{dՓun5sv56cq{9@fD"ZhљYK!ʒ9SqSAEPM8M䝪02NON (9/֥_I]pK,ldQE0 ( ( ( ( ( (9o*GsVPV3xfe5VȂp  R,ӿY-qۆtIQDXl# 92;u֫gb.h@1%j$r23ֹk'Ky41Fm| Vl)4hm:ukcfb`vm_~R cfMap1o0>j}OCo&څ< 1Var[ivl&lKOq 1lXgdd#Ҹ+ o@l!5sb3?~ajY%~&}tamE|v6NGs;%qEl46m d?*w4ʲIs |0D[ ټ!VbH FT`ҜRmzMޡkc%w2kr<8UxU^Kyqx'R29D?S0=;ᮩg\Z-B[o4V]t+$o24ꑘn0J#϶kFS-cYb}nV^aQ̑ޘ#ܬ2K2I*FN8 V}1du˺&ATIY_}?[ۻckW q|*Uhq%4ie6^I㯯Wwxº]s u/- ((OJ*#։`iWc=#NN#)))š)€)))i-QEQEQEWl任ˆfظ u}j_d,Dw4QEhHQEQEQEQEk=h ѶQkiL04e￝gڭ=h ѶpVREx(]KXH-d1A 73p=vrkhU[-3PH.m.\Xܝ;!>(߬[ZCab4{]ݻFܠ#K [6]nFQ'o4m4ՖCf- wӚM#E.NEdx^y#VڶiJIn -.iE3Q fR=AS*KKgy$v [HnK6ӹvqtwMH%00n |`}j[][)HmDm*-7ZD8g9y6+|n$DV@"'d$ۛw7;؎Lp4Ȯ Ns,؎-' @ax7 cODciLYgϚn]'T.Yfh7^] Q ^+! Szg8隫m۝:KЮ2)F=ϑDWsknϽ&J 5KtM7l4쩇#OI52^yĂ5!3sƮB%q3ܭ6ξO$yQrz[Vo%NJZ1.8\Gh l"aXdx5Vљ偕nK8B6'y߭Z"M'@85H*ZxciطR>ʟ?/skk Ʊʋ;l7OnK~dtǰ%=n~oK GLܑG##]a9,[zu̗{<)vۂ21)i 4&bIźrz8m!d_4>}m1c+ )_VZ*K ( (9/֥_I]q^'U?wR\cn?һZldQE0 ( ( ( ( ( (9O%+IuV0#^HTFЧ??Z0 Uk^}WyHH'88IХ??OBlla 7߻!F2`8#AoMYHkڗ :x/ug, P I##f5ʖN0v89'IMzU.R\+Ȣϱ^=l 9E7KyiUUXD!I Ts<*Z>uBDoݴN pk ]/ jmy.EKNq&HT`ye`1eC_6fa)3 _q nyemJ-H" ~ԑq[Kq<{ ÿlA8eE:]cf[D&i Xh]Y@Sn:?~KI.V m(yDjЮ@AP}*Kdc%] On|jcEӴ-m&/\ErѶ$C gߚJ,q>4vF< %,P|+ۑH-OQ\g="7Ly@0IO>kjP_4#+ͺE`c(T6@*)i$BGSaH 4W;c [O_/6 qsEGs(9',OJl4-"H$;VVg@ xbP::V]ImH1, y$R;dւx; >h##qb@#X2a rcZZ ^n2}6k[YdbѮ$)CaTx9tiεٽNT+<l!hdazg%52]_:O8hE)0P<}s\8ҎQHbI @HCEN7uZĝBhRu(9f-G7̷(VG `tZ'omTm&@ _#lx䃷goiL0́ M #_W],[9r.3jzn;]1\i-ٴ[F#X%ۗc#!5TLr"yv}`9"+uˑ$i(eFPHR.$zެ"cnck4zhi[ҩiHsm|Z^$lx.Y6_%Jq C.rr8RAhf,d.IFPuN8⋻S'Ē3vup3 'r23q]VοC=ßƖmMpFQJX0,:MC' gdq!T vvQZ͚(((<+e>kHBJX`>fo jLmSS6tyF?u \Aޭ{ƥ~_(Aʣ3qne՟Q`֡L^n oeҷ_fw{mzJH_3[qJ5E׈QCcM;-/}u^oQt'St&% e7^*Dp "i`>FR"f2ɖf2ef^gW >iдmwVEG]MOߺpDQܚi,y}.^LE^>|L i\g? {?L?E{hK]sWf@m E"v-(EJ<@КL?E{hK]sWf%cL?E{hK]sWf΂2\-/}u^(-/}u^?2\ 0 Ux"XuK!A }_u o7ZmźL篡5;4ј󲟺z郞OVsܤWfȬov ܲ儍ճֵEckڼlFn/b1e䞧CJԜxv6O-n clw$ЬRLɘ#G ڃ'M`ZN,cBGʨY'=G8&Yw'b6$!>VxɏvICA~j%o<Wl7`0^3LHJnK|ڸJu,oo. hʕm9*r0 ⹋_j. gp%Vxv$0Rq~sWWR{$k ԥ1˖8n0^(qijPiy~kHhf) zRjӵc#\JDezejKp6oXE I +AaQ'u8dhHKHq%oMKv PkcJ/ K![I`<Ʃ"1*B<j+ח6*Z$i A"`ARYO;H9#Wطζ_60R&9;So|cw/mmCJ@i#SFY~cw^;huZyXaɘA,l|Z֗7^dMu6fp /x@sU__κk[{eCdv$׎m:ޝwo0yP1m]}EKM; Ҽ%cHڼ@6E)1vٵaJ5 '8.ױ3c=MSU%1Q)~A<Nd S%Wַy/ * ʠN7UkdEh x?_ ? B5Z ((+Wwxow:WA\sa]KKf ( (8'!\[|K[W̵jZ:7 ez?}m*ծ 2іGvjZ]%vF-|UA2M8Z:7 eOiw4qZ$6,2Kt"*O*R~fQ%6i h)iQ/$bx)R >8gI-HI6Z!8t1ҮoɲPmOD{Hw/ OkEDN,֋&]{P3u 3NssMDHl#KH/>Sqmn -4Y%i (iſ?Q/$1xG-vU+Udb#8auC7$[I`lZ_Ύn!o4> ֫j^~j&'Mf`Ž:޲?վ7[\+$gM|gK^r_+CO֯zP6O$?A\!=-4k%t֞O␉mq<Jkdx![K&O=s/+)k"u6fjZn Ȟ|q$n 3чV= bsq^4/o @p")?/Rw/ZuloWn|c2>S-Q51- ֒[ͨJ5O(qlgxl[Z[sPI`'{6yE9#?"1I7]0'Vwȡ뜠$$56.+oxA%:YHB'nːSA;°hȤc-TGpy+&wrɥ{.Ѱ 2Nv\y޴ؼgttyK-Mcw\e:ik>m7+4 Fؤ te*(G4\6r?:Ec9HOO-<7k(*p nZڕۢxhĶ̦S#v81&(Ν@z{?. lbyYw2v, ձ5GENolhe@CF#pr3ӌT򶮍DYO;;)xWC5INERH֢kADb0r%'4 2G j 88i7D8#l^2 +Es~3c}r4*XW#bA k5N\xX /IX,H~!\~>Qߚza BBHM|2qsrs˱鳂cvF9`zt8 4I"e>"<){`K#!Wz`QMHxQ&VWD{ ״N>$i]ه4;zl$1F=5)!TxfAh$D64ʌӜGEt3[vm7-r MaAPF ČҲև_* ȄAp{>5ghp ̥ɰ łV'QwW |mo\4ڝrNy"DwtOЍhV~ x?_ ((+Wwxow:WA\sa]KKf ( (9-G6Ү 6FUS7Pc+mv>i:i=ՍBsĬsVbj:mΣ-R/y "2?.>>+qmh:<0I ZME.<[t 瑎yS>o2IqJF͌hX I^EΉFvS cFy5[^-.oHKǑDF?w|;`S~'^-YiXImI\AUTazuZXhxEO!UK6ˌ9EqoMs4a~7{)z 'slh'ijIR^]NWWxXDDt emKM0%fQ 4%ːD|ĭ́} 8owF& e#Nw~Ё3GݡG]O"Trô}:,q*'(4>e/A1Χ4Kj,(IQsuK@qsɩQR;9 ub=p}"YTB-WRHKx1eܻNKd2IZi(C ( ( ZY%ux >/?JnL(H ( ( ( (9-G6ҬFk=h ѶXp6uP/2#wmw=k)|Zˡ)š+Q_2޴60X>#EqA:^cmMxX`H r][cI͹rQ`*τo.,;]>MȘYA"H|,~ly}}e܎yv;5>g5b@9OP^ kGTm9B9G# ^ϧ, 8 2}ǎX戤}M4'TVV+gY6&ЫWpGCojuj K2q#0$|StNUo|&I7&;#,rCŻ'$)8ϮSH9ナ"|kF9不Kf?k}GZ(("(EQ@RCK$o֥_I]n2 (Q@Q@Q@Q@Q@Q@?o#wt3;i]WzztM\_­w51TʞzqY}JW=etTfl1w2xp2k@Tr[ܹyc&67Vkrsx=n=)A4lbь]/?JnL(H ( ( ( (9-G6ҫrK.}]ݸgYz?}m*ϖ`bm qN+)|Zˡ n;+ַkK4GhX ~hΛBZ໒de_8qzk9^7m'h'4Ki,m >Dx&8fF1Fb$qz[xn!m8MJ ,uwqseZM5%d'cޭ?#^MKĿkc .[J0~O/m ?O] f6RaV28>ky@*+,QfU@r}9ƫup,1[EzpО 1E}EcO$Uo9U|C,.5Y'Z{E!9)s\8Ʊ`s)t76wg([cK8Ԭ/|o'8't15đ_iŷl[m\nNFj ͦ%#^3IV̓qznGVŊޭG$`7V119\ {M>Dg2XM62\ypx} =]aF>]w,,㗌5yhdl] @= u>}n8;Y34%K,yp`V>NO{,?̢]Ns<\BJᤝ)+&t:'F+?D</օl@QEQEWk+-Uv?fɪ߻3]Y`MW?|[C&~wtQdg 5_ckOšֆ$,̲<2y$ĄXWQEBQE((((OJLv2 ~Cg>f7uսG6ҧ"ܷY O+)i"u&j7b."Lx+lS X<ѩVT9p0֥͌%tr>Fgk[ySށBsq[Kwoo'"6*F9!p<6I7k"Ȳgp6˭i}<[ƬGJBF:u@Y2iQT_Zң$[u (oTgZpƚmAk臫 Es.+(F"ݢԭf[3+Km=xMTX83E;HIE%܋Y.לF,7g'ӊt4BC*#ɻu g _3#['(կ>psCq"3*C~Gn}+\oUH.eZV)";mb㊏O?$Q{'(ro,u4B䢏}/Eo羗y"1UQ\HO?$T2W5,?{'*c^;K.!T˕d1@:D</օQxRDda*|ƯVQ@Q@|JnO}_ |mۿ@O7@w?Կj+o+lPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP%6FT'@W]P%rO6qc9%=WL˞ѧ M C׭sGM<~{jfsG|'(0v1n1~4|ƛy"Fkq' YQm\f NJУL.C5 Lpyvx~4^fq}sw$GOS*0Jȼn+A)EF$&q&yٻ'!c#yp ˶tY2v2nyfxk]|=gib;QLpW>8 Z[ƙy".J}8{]7{8 ĸlMےz(8s %Gk們|7rNU<~4n?O?$RJKagSK%{M:d/}k% 3S?39?6qT7{'(inYtd̀?"H-Ӈ+18c3%)[$?3&I83+Y6k+dW@i37<0q$v7?K<E{sI-ڡHܬZ 9 = Q+t_e8@WMj1۞o羗y"7?K<BRCj,'73ho[aI%رOF{梺y[`XP~`;8|}/Eo羗y"H\-峎)ae$_,؂$9IE¬_-ȯ#(ܻ1ܥHp~Z{'(|s=ZAht hy؂TC*K;62;q޴5#b8o*>Hp9UgA\&xT.t&93L6>9Ğս{'(Ҋ#-ƮnƢۆܐ,n6g Hzgұd;I;cbgұ}/Eo羗y"HVqK,<^o24H^Y$ u=+((((((((((((((((((@%{]'>6^I ; _[5t7@w?Կj((((((((((((((=uKu!g-HOҀ6h:5#IM$Ypł=ru mƲ߽1$aw6 ë ՏGk~u[9#kgibn$IpzH k]LOL YҖ9 "@XN@l⎶WjzNj{7{RmygZTcwFN Rjv:pjpM2ۭ#vX12g'BMEy^.WRĶLR^(n7tP {@ԯo@k;$c@M+rvtWk~3m{yg岝 Ȏm o Z޹qi5C$s"5C`Gr3 < 9#HּY=GS$r%kxBB_f|brP$jSi`N&*Gjq`jC+Lm+A^cOݏc 15GZmQ53u"E?&9PZS,KH ʍ_q?SaY-]A2CJ?v դKB+ 6qLN$b'/ iCQY3YG \u23/A_Ǩi6RX"h5kN*P{jxGNEϫ-27#VJx5i%,b6ŷ6l'lcigXD!Dvzc"¬\<'+=+k4>0K,3b/dlw~PEPEPES\XCo?6Xۻb0gPjt>*ns{V]:هU+;.d`}» 3jz^ZGi%ĂGXA\x'O][j(녱>e WRc_4r;xYv҄ + zOhWi6hZKfKԂ4 )#nXv$dO;:+pY ?8PeoFfSV#ޅ= ^!+']WA\9? WUPYе]:eyLF'# Ӣ1? i6%2m⏝* aGCmJmu {vgIbI!v^€[PH: ;*ZdCTd<) zs 񑮴]:s*mQ <֥XFT U`a=N*ЮEӦ{_ %1x:(oxztHbsi:UVvIı'€*QEQEQEQEQEQEQEQEQEQEQEQEQEQEWk+SJr{OR[w$L@Z =jQ@?ha"q$q̱n@\b .."Iz'ҷe7pH&ohm,N-O)#@LC.\XE`;H^̫(|D@':鶋mo+lW?WR٫(((((((((((((((((((((O|5`_W?O'UZ(((o+lW?WR٫(((?d++<'aY? ((((((((((((((((((((+Wwxow:WA\sa]KKf ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (9<RA\?xkV)k((WA\sa]KKf ( ( (9sH?d+(((((((((((((((((((((>6^I㯯Wwxº]s u/- ((((((((((((((((((((( $_ K]syZ襮 ( (9º]s u/- (((C! VO"sH((((((((((((((((((((@%{]'>6^I ; _[5t7@w?Կj((((((((((((((((((((&.m_T沲5;K"dP~0ևy*/O7%To<RA\nFѬt}wFh,㷍%,U(' gU/O7%Q΃5J]gF:"M{e ċvt @8ɭ:Q@sa]KKfº]QEQEQEs!+']WA\9? WUPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP_ |mۿ__k u/-  ; _[5tQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEW?'%Uj VXdPxFAE#eŚvrYOSw;FFL@ :p&_4[h",RKyf/f: m5x[e&ƣG$+HP7.0~p76Kk6[b GSg gj[]CVrZuDAlm4햱NMvQtRnqwG\꺭լ٘R`xQ]yF39eJ /?i_Sw?xkV)k~)<^ZkQZC2b6X0ȈJHks3MQ > u/- 5{?J=n9PKÔYue>I}oWj\&O"TkϾ+5Eh{]'}^?5[t4W= >?Qp?d++|Ocwzh,Py?ؗbYGMtE{ƨ OK-5=/]w@d`pF*0 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ow:@%{]'>o+lW?WR٫(((((((((((((((((((#x)kxVFmRvj8S0S8S4S6^I ; _[5t7@w?Կj((((((((((((((((((((|7m6ѯ$$ڢ%$d­G>24H-&M Q# 횣i? 2Xn"vd¥>}CJ5^%Y}ܙ#fS{zV_SG~'$q,v!=8lHWk`0fY%'wiX >SH 7!xg9=&S/g Q" gDVb6fXb.oon4D*+h>}> k=-!BLs>x1*qM& _:}u3LUb}`dؾh-Ϋ>ȭFhB>U< bPmвǺDȇ(@@ =i!.T]9/_%J!0/fJyQk+M#I[4i UxK d0]qgdH<HF#[@ /#=Uuxao&HQprGLKM>_C[2l!n^mit%\%4%Fu DbPE*v:Y$!v0űx]f\P@Mxz;o )|΢3 ]Kz^tvѼmk QánElaWm>iviڞe$"d۴J9[{\ilֱZI:] b1׭-ԔA77Glodf9TIIy- [/"( njʜYe:w}NтD*+`y$l YmݮoLKm \)#ѐXnaySFWyi[s5GMr2"@ǜ*]ĖާXosi,, ~{":[iֶ>}qZx~ΐfo+lW?WR٫((((((((((((((((((()𕷉VҒۘM2Ge_-p N;}m _gFLU<5s-íhmeu-EAṬmhj][I"(y#k7N}k4B_ѿS/$Ӆ5_I q$ldd7 pJ 'i&{F2\Zi7r*)W1Uv[]j4_| EpDNBg,)ٖ 'h'7_I K.)e`hfF(OTƯRzW0~ 'h'7_I)\gL|L//ďVoɒ@lzk}j_dc )QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEWk+  K[¹ [KwCmlIR/2[Z=~ok=ԗ2FK^0ګ푟ZùH3B5ABd2ch\sUUдEҬ~-a>qӵXec,.XJӼcsYٗR7Kj!o,~M~{gRvE&]*"U[xnT+(sV΅<0UE t*F8:zW9k(V BoDC"~uT.=?^[ME ՇqyLv.yi׾c.<;wċ(8 Ө}(D1-JB Qv|.ǁ mgmRksMm5[(h\g(qGqY^ PA-krc%jFsavyr,..nci@gqj״6vSvwۻo8jwrDO 0ǿ5Ҡ&M>@Mh\Dm6nۄqO>)UCy p6L@f~$=F$豇FeSZ#>\~|ՙ<6[d(f&_1V#R1`0z>[Eu-4iTK4"!MF.;;sQ[Iokyq<_+"H1P7d gA߄4/`= 96pEepOJHIsp HTD#)F,`XOpi{x͊JQt"\*;%Xť5ohT"x#ymaKtϯJ MqWΏѝd1=c1ׂtkqp1De~nG=} GrIJme ,BrA֜|K͜E8brH`4o ZZ-rM@%x9e=NSԼjoJ$${C |F%}nk4֭XXHOTCĚYbpcm Oi}Cmi9$սŵŜ~,xV_+.1vr8|aw,.) =(wc{gݱvQgY568VS;2"wc qg9V--$K;5pqoz͸W%?vve*TĆƇk_2Ͷ][*@T)o<|Oyom$q(F1L;FO?LVN{}"ݗO)|"qBvU_^t}bm(@=:,ٍ.]H4:J .@s~vsRXk0j3  `EPu޲ڜf6Dv|p0O˻a]نm屐X/1<ZY%w5x >/?JkU!ES((((((((((((((((((>6^I㯯Wwxº]s u/- ((((((((((((((((((( =6)geՖBR by/Q8J[Wca _@L$䵹eYNAimS+rXh*B(`H$ kP[\if`61GP(~~1WI=WV[̻J䌃ץN(i/5MoIfntyUJCբqjNcrV%Ɏ1Bu*b}5vS6$`3;p8S[x27mo-&3JMH>kE6ӥպM#$m~*MqPWlb]O#If)2jxGRy 瓋ZG]^K"stX`NT$twŦ,QN.ZIURY2HE8rX`}ʡѱ%\*-ts,VnCpZmXk/"r{[xY4bV6L(ʪ, uQY53G=rS밹e{<ZY%w5x >/?JkU(EPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP_ |mۿ__k u/-  ; _[5tQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE>ޅo#ʊe1JѰRҴm#Yji$g$I8>W$[qM#/e8+PMSO8H6B3@=XknJK.'UX}+u YL^*$̰0;XG'<.3twב^J `}Iw"[BOm:+g??su8dLSBOMwa? 1F*$B3̝?+h:sڙ-%4R2 qҟn>-7,@+H͞O&OZh|1;q铴6?yRlF(a鼘RR~S P$jrkB9!d Euu+ $Jbz䲒G$TpNdx)72*Ads38uK%1L:D!w' M.QP+#%i$u*Į7`.>lqUn8 ǽbxN7x8.-#ۃy@8`Ѽ1wyWS[Mi%e]p v*B0Mmkm֡o Xζq1 #a*1⸮^f("Y%F%<8ED ot.<z vecdl1[z 6rMlhQӯm K $V$k~\oyx >/?Jk}j_d֫bB(EPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP_ |mۿ__k u/-  ; _[5tQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE0/[rZ܍4TE 0A\׆OZS2kKq{^}[Zo9$ӵ[1}!<+}O\Gm y\7gv?M6WGScHd7~ :? 1-l*Fe ٮuMVՠR@[cZ##o!!FT>nGtuY" F?<`VHx>:'o"BdWR<sڅO<?jmH`ZKٞD`1r}k aY+#m.B0㸧SmKyB%8?<~H@0Ttm)H(]d]` }45lz&pA t }uwwB%I ,,PtcF9{}W ]IaR*`/>敛7(ǡ6](T\908 :RD̗+1X7 &m^}P%Ek3hf(Q Nᓁ];UxbS$).$-Ҫ.xv:KEWqnNA'pX>j}$<`VErT\WTa[!iȩncɇpG5Chfpo'<|;ksEM(|&6G\>l@3&Ú[2ī3Nđ8vr893crj'mCQHQC 6m夀 WM#êP XB^Wۖ N;Dd+4RoY-/KOֵReERx >/?Jk}j_dc )QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEWk+tΟF1d~lxE{5]O&>ؚw4r 9N4_'T:'u_鿱4hӿo39U=~ ?t_ؚw4biȃx)sn2uyj&UbiϿ>G"fsh~ ?5|q!b)cnOL{ 4hӿo39O4?MWןj7eGvt[']&>ؚw4r g= Q WCϿ>G&>9yj&Tyj&UbiϿ>G"fryrƳ]^̂h6NJeH<[m:C$lb6?V ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ow:@%{]'>o+lW?WR٫(((((((((((((((((((((((((((((((((((((((((((((((((@%{]'>6^I ; _[5t?5}϶}Uۼۮdcv:kk?ᦿQʗj(ᦿQʗjkk?ᦿQʗj(ᦿQʗjkk?ᦿQʗj(ᦿQʗjkk?ᦿQʗj(ᦿQʗjkk?ᦿQʗj(ᦿQʗjkk?ᦿQʗj(ᦿQʗjkk?ᦿQʗj(ᦿQʗjkk?ᦿQʗj(ᦿQʗjkk?ᦿQʗj(ᦿQʗjkk?ᦿQʗj(ᦿQʗjkk?ᦿQʗj(ᦿQʗjkk?ᦿQʗj(ᦿQʗjkk?ᦿQʗj(ᦿQʗjkk?ᦿQʗj(ᦿQʗjkk?ᦿQʗj(ᦿQʗjkk?ᦿQʗj(ᦿQʗjkk?ᦿQʗj(ᦿQʗjkk?ᦿQʗj(ᦿQʗjkk?ᦿQʗj(ᦿQʗjkk?ᦿQʗj(ᦿQʗjkk?ᦿQʗj(ᦿQʗjkk?ᦿQʗj(ᦿQʗjkk?ᦿQʗj(ᦿQʗjkk?ᦿQʗj(ᦿQʗjkk?ᦿQʗj+WwxG*_'/olj{9۞PyXB-1.2.6/doc/html/_images/NamespaceArchive.jpg0000644000175000017500000027613013152762205020721 0ustar pabpab00000000000000JFIFC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222/4" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?Aloou;ޱwKQ@T(T :U|-A$)6F>ȕAx pN`jq=b"aڢN6'88`K=3SH5#p!54W΄)r8p ֹ=G!_k=z7^][ v/|IUȪvmt jmCI|[4v\m3}[8:3[Iw\+'o'j7'J[ hqyڎ4{7 "n4 ~c o4ң7 GH8+rn- -˒IHYR "Lt(2hn?ZoW(M޴A.bǪj->1Y_U-t_/{k"XhDj2JKL˶/}.vQn?Zoq4x]z&E+Jocp|u9w iѠYfϹn#,]&\koS7KszCt?{{ǫ` Ǫ[[zMw>䋽-WF^y dj!_k=UωƖ%l2+)& W''LjWgGi ;VRVB#nw.N2yi3MBŮno-g52rF'F;Q?~W:/Ct?{{Ǩ7Ksz[x:t666ȷ[X*{{ G>}}m{y2m F<{S:O5k]C\-dr񉜩 1.Tq[_TzeεE)Na'XdԃRƺJC9Ct?{{Ǩ7Ksz (7KszCt?{{ǫ9Ct?{{Ǩ7Ksz (7KszCt?{{ǫ9Ct?{{Ǩ7Ksz (7KszCt?{{ǫ9Ct?{{Ǩ7Ksz (7KszCt?{{ǫ9Ct?{{Ǩ7Ksz (7KszCt?{{ǫ9Ct?{{Ǩ7Ksz (7KszCt?{{ǫ9Ct?{{Ǩ7Ksz (7KszCt?{{ǫ9Ct?{{Ǩ7Ksz (7KszCt?{{ǫ9Ct?{{Ǩ7Ksz (7KszCt?{{ǫ9Ct?{{Ǩ7Ksz (7KszCt?{{ǫ9Ct?{{Ǩ7Ksz (7KszCt?{{ǫ9Ct?{{Ǩ7Ksz (7KszCt?{{ǫ9Ct?{{Ǩ7Ksz (7KszCt?{{ǫ9Ct?{{Ǩ7Ksz (7KszCt?{{ǫ9Ct?{{Ǩ7Ksz (7KszCt?{{ǫ9Ct?{{Ǩ7Ksz (7KszCt?{{ǫ9Ct?{{Ǩ7Ksz (7KszCt?{{ǫ9Ct?{{Ǩ7Ksz (7KszCt?{{ǫ9Ct?{{Ǩ7Ksz (7KszCt?{{ǫ9Ct?{{Ǩ7Ksz (7KszCt?{{ǫ9Ct?{{Ǩ7Ksz (揍zYhzik&2jI2H ˹=~TU;J`lPnđaiSڍWQ$;M?}x[l?ȴx7@w?Կj(g?oE0 (g?oE0 (g?oE0 (g?oE0 (g?oE0 (g?oE0 (g?oE0 (g?oECz R8m=4~gvdM?vzq ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (>` FEw=?Qho+lW?WR٫(KW⫍/Km k7yl!5|aAmM?P?Xۺ+)IZJx &_?Q7$KKw?/oI|aA}MhZ9r;4?M4y0Ƈ&8QÕaAM.gCDZbG;TeO7$t?5)Žvnj?3oI h'kXS9QO7%QZ ا 9r?Ty~0ևy**1|kCrz[ojz6 jztMdۮ ѻ3a+g9¶Ii~*c:+kx9-qM亴Dams"3]f{QawxŪy=\\G ?Xku:uq=1* ueVf1޹~ ^iKnfݥfVHRFY$1K@g p*%ܠB kSm!!mٴ7Cҵ,VpdTǴdauyt0&IVkyenXu1_hmn-W;)++rK'1 ;XdQU\ǹ w(4(  @H[Š( (((((((((((((((((((((((((((((((;J`lQGCº]s u/- ( ѷu|ViZ;=6Ҭl̷YqRx[bkniKXCkF_B+B΍5#7-`W"i :7E +Ÿ,KW?X/&7V458.Umu, vL /Eӿ /EѠzv Eo%ӫ6nnl4a]OX/& Я_M078W><?_Ӈ<%B@ji1wsG:aу) +#_+/ ' iQX?Km4/Oz_+h/ Э/&7A%B? ' hz_+h/ Э/&-: p'QG ڕźFyx8#22FAFĒ}& ' h_+h/?V?_G [D|_M 7A%B? ' hz_+h/ Э/&3( מRMiakz E͜GO^[ESQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE%OT6Z( FE{sa]KKfº]QEp͗;7=fxWf%Hs=q(ug=OV?6iw}1J$cJ[I\5G=g_G=gEHlɅwm18HޛƽХ??KХ??KeiɎ4p >*\s>(k8VՄ7/*X(Q 5 +/Bl/Bl"|Mlw"$7D^R47˻!If6qiDlc};miz6 #YxУ?Hoj_(_*mkOuZ8bqmw/OvۻqҐ?/ug 䊥x+ٚ xv.{H4m疹?"6c?ݱ_iR@gͰ6 K1\(xOoYE(B~"E٘y_`$#l,݆O#6,ʂfwkyp'i4˹$ ? O$Vb,E<Ϛ6VH3TP1IweA$ˀII;OH5?eAП/Hd5B9"7 11bNA١n4f$ ? O$V`AП/H OoYEoQ@?j'(S?[_[P$ ? O$V B~"H5?eE`AП/H OoYEoQ@7޾6Lohq |8sh?P$4:RY 1xGNK< 9wUnf7`SP,E \ LAr|NNrPM]_lGhW*,,WGFW'ns ER\#%HH)aʖʒf.%7r݀%e2c睙M?m*2WOC ,[,%7)mXڪi.^Y+1Xa$o n-WIN*MlS^qG*1o1v1sՅ?t߰Ӥ&s1b7 UєddmEE m'KGH`1@;IoE (QEQEQEQEQEQEq:~/3Jl{]G\A)nW)"C zjp_W-K=FҰ"0"DV9SiaRݘWGKms FHzd'rS7 >M1Y,4 rvf8oP{ mβ(RH7BX1ぃimfڀN Or)lf{E#c+ M.oбxq;~3$AGziiA$ymfwlw,xrxT:A Ubm&(տM$WOE9m&(տM$WOE9m&(տM$WOE9m&*6if-,yb$w왛5O QT (((((((((((((((((((gc+Z+` FEw=?Qho+lW?WR٫(:J`wQY^jҴJ,ڥ*FՍF"`0tMe-jV$ywnm$; 1[W$`n=aֶQѬn$r+( !>Pn'vm5rG2K4kۂ!o[+h#@|/?x *c-6eP.$U` 74gh$>j6sڻ<@~0x;N7& !vV\eսG\Seq8hȡIf 0PHj#zif۬gټJ~ zTZwb2"JP`r,NsZmǠ%;jYVןc}.dHIK|C!Q:V${t.g_ yK\.+udM2͑Yl1$O\Fȥ3gÑC)dqqJC}OuRUHȉQU`Iܤ4Ic*d6C%HA)+ܶA<)z=Qyiost'~ēByA*9Y22m槧E -8mP"*Oʛ_돗莭h\`S2(= ߅F-wpAdJ6g?{ǽUz5 qxm20a+m;+.ipbk#ny2?c WIgiKku4f6bJ!x9CRCx iS M)8=zݴ$_J]jɩ$H׻R˷x9ޫYQ-6;v7O(ޢ(AOM]D:LZ,`F`TKy!,‹.UoW_ZgKko@Sx2 J}3 X*?VFpzf, "kFY W9+o,M2S43#6ߟ4'\n*wt}2) EiolM |c?5r9f0|h,}՚$; vNHEWڅ-1yJblW@9kt(K[tPY $Ǯ G6BUE2}ȬߘsBz!YѴۛ;h݄$.lRemv.;&X滺ec؃9p6. 6A g I`I!m3%1= Tsk=,pedpwn%*=VkTQGQ ;Z[۸aH`.u%qԢ]7C blrRվ} =]aF>]w,,㗌5hw?gH+ᥕc X.qNPkN9ncI0F4p. p9¯\^x{xtťk|3#)/xp~Z(Rw}3h:nlbFKKv@+|K.0IKrc.jx͚(4(-cw?gH+ᥕc X.qN5n&0*F>by sKE+˥qZ%爯'kLZV9> 9ar;%@HMJ? EwuESQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEW?x±t{C,Ek@Q@Q@Q@Q@Q@Q@Q@0~PGe;J`lP7@w?Կj+o+lPEPs%SUZh].oco̠ rA99֟s%SU,[jM2U"Whrpq\VR݊d7h.]+}noMTfI/#aWJԧ''w QbXglHfV8j^Og:]-p!CݎF{}EG;K\ay#~|`+%Kk,W.O |oz{K626(0O 9=*uݮвGjU dy IǩCGjGv"nLcr>'tx,/lwFw2 T߃K7F SL]NFmlXёt}A^7WmmQ26gnT8bH5",,ηGS-[#q9ք%N qt.f0IuYy~b\O<;rq-aqO3ِ*OlZx>%cE$-<ׅ*/$ʐ-*Rp ϔC5K5ᢍ&./ey>ZZޟԞ_ dW+ƥ(rq*I9'4.tIs.J+-eHGԵ+ΦUD";ʭ u =1Q!ih'8y "Pl;'\qJ~AzsFeӒR"MH؈ H0 3G41%se vRvEʖ'<1?_Oc]X,QԳ@, Nя=Et")-P ETQ@Q@Q@Q@Q@Q@Q@%_"4( c7QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE{C,Ek]s?+ZAEPEPEPEPEPEPEPw=?Qh*?- u/-  ; _[5tQE\Ccn4O&i!-ŢJrxsX?<7@+8]ܥ+-߿ɏv3;Fwc>  ҿ]<7@+1}5g[.aRc?)RO wHP9U^Y_.O1]v4>-l-`DmBFFmH[ip8Kr rAY<7@+  ҿ]>G.:^z%ݍ!İ#94S}dM>Ϙ898yU^Y_.GOoiͶi w7rFO4%WKЙsW* /Jtt¬GK.nXH[S c)hew3rFRY Ve9OU^Y_.#+on0̋WT@7I:Z+oD,f$:0?¾ 5Vn5h="+m8مK̮chOg:?VxozW ه1Q\* /Jtt¬GGc?U^Y_.fYEr<7@+  ҿ]9VxozW g:=se¬GG* /Jtt{0:+Y_.U^auW'  ҿ]<7@+Øf%_"Oh)K{x1An1~Uխ (Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@s?+ZA\9 VQEQEQEQEQEQEQE%OT6Z( FE{sa]KKfº]QEQEQEQEQEQEQEQEs2#!b 0TL}qU|Oӭu{t[?eP?1Eljӵm[-*K{mwcw1i>]kRm~#kWXͬTG<:bƞt+ A 66pZ[ bKQ2y<5P((((((((((((((((((((((((((((((((sşHkgc+Z(((((((*?-~PGe=WA\sa]KKf ( ( ( ( ( ( ( ( =!V?"sşHh(((((((((((((((((((((((((((((((((gc+Z+` FEw=?Qho+lW?WR٫((<_Xj2Рlm!]>w,̵3yG<-B֍15.Ve(h x/¿-hN :7E)Q\7!~gFpW?Yѿ/&p;z++Ÿ,hJ<O4_9NҊG|'BƋ4Hbl"GCggEp'u8l4IRHnU 19N0H ' i۠NsşHj?V?_N_+h/UErKm4/OUEqzٵHRFbpT),ĐN3Mh[O i8Hi+  G ޟ8rǧ|rگtC4JvO*oA%B9ÔꨮW Э/&A%B\uTW+?V?_Q+xWG&Fڻty!~QgÔ먮FOx>'[º926ۦF '8H;-74Zm$v1+#؂\z9ÔZ*{%K*`~PqdQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@s?+ZA\9 VQEQEQEQEQEQEQE%OT6Z( FE{sa]KKfº]QEQErZZ'om[S_Dmbp h M@ )š)€qm#!A$* iV/cJu-HiC9 ~>qxvm cZ :,_l.%%g7RI;oy 0v㜰'F׍,nnmo"A;R_ppH;A5w+ )y6Yv{'ƚe1G!&@rBT F_2|AG5)Vu,&`$Ah.r:,*oyG#>"%c/Uf ]`0pIZۛ{; m$Hdq!ĘRX 'ЁC2ח:kY<16Q4+oڡa8m5Va@*K[wo|F%`FX}0CUk_b>ya58xn4 çbAť+b7 ?B+c0((((((((((((((((((((((((((gc+Z+` FEw=?Qho+lW?WR٫((K_Dmbk=h ѶlV3;MR1œ)(E2nE(X̊C)?p }7SE1[YY1&gDSMpnZH.»I uz5OS\:FqmsӜݓ@e+q\mY&5i#țmb6 kmqX nHˁI ;_Gmf>ыy䰺46Dwf!&W,k+"!;mIqs$1<ҹw"I'FѤw  }̙Ÿ\q|E'"vBr`S~ݛΟųnxi+O iQIl%fUH RIPʮ`x~M$7lZ]<0y $ )i_beVS.KҴ;fh^Kt#ҍ#ߑEy6Go5f-g4A|Lhk=a|YLxڤULm(fKԧHCT|zO #pZi4]b 9'R]3A$o8\lHPRAynvKodZnDmJl1RoF>`p9_K ="-N":L4o ,;co)҄^vV`hsL񮕫}kasX߽T]QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE{C,Ek]s?+ZAEPEPEPEPEPEPEPw=?Qh*?- u/-  ; _[5tQEQEk=h ѶlVW&͋ >b<^?x1zgе5g+)\v7E8Vе5g)Bm՟(X: _6?P]ApqI2眨e'qYbQ/$`_7k_Fݭ߫?G{:u~LE$!d&S[6_G#z<̐OD:6dbi lvhlf :NeDXb r̨@؄ˁҩ?ߛ/GO o=1Xޢp͗#C~l+O o=8kz|q$ğ MG#z񎇨C}~GV2&pZp#o}ӮlcV[8-IpT"wc#It]zCoaNnPKdW#]yZx _[Wc2 e,^l/{q]=nƾ!߅F?kP̎5p 2퍙zȢhwfg($nv'Nx튫C~lGOev@1XkTӜ>.K-\qKs* !$PJ0S=s=j9T𖒖[boÈʜ.|Bq]a!f$ҼF [$IS{T\6_G#ڧzzH!(4;2r> , +Dzq6.ɣ6^~Yj9{T\6_CpZjYV\_nҐgۓRqH"&%NMߔʮ ddcTj9{T\6_G[:WHMK(D!"僎2֫*w,76"7_LƧdp0GOe=ߛ/G px{O}YdFixn#v7ryk{T\6_G#ڧzz(S=s=j9GOe=ߛ/G?s?͗#C~l: +{T\6_G#ڧzz(S=s=j9GOe=ߛ/G?s?͗#C~l: +{T\6_G#ڧzz(S=s=j9GOe=ߛ/G?s?͗#C~l: +{T\6_G#ڧzz(S=s=j9GOe=ߛ/G?s?͗#C~l: +{T\6_G#ڧzz(S=s=j9%uwu3^=^[*+:s,jH@:[QEW?x±t{C,Ek@Q@Q@Q@Q@Q@Q@Q@0~PGe;J`lP7@w?Կj+o+lPEPEP%6FTO$̏k4+a] ]N>_DmbpMCQ`Ԥ[vybI3N0 = mp.2I-ku.) \6y8|v)[MJHZ;~';q> Ik{ɃYxɃVd[kxQҰ T 0r3hSI4ǟjwky@1 O9nf/^?[,&%'{Hٮ^ES1 .E5oV?w_)-uI}>=9 9fA:nosFOx^q-={Zԭ̂((((((((((((((((((((((((WA\sa]KKf ( =!V?"sşHh(((((((;J`lQGCº]s u/- ((<_%~2Ўmmq7})qpШ_2םʎsquh6C_Dm\uffAŷn9YKYYJ]x7 jpWoKմ+"\{-ZKg[uHI 2>'jVnۍW _F FPto-)Twa,Rwz 1qT/|[teylm/d.IpA(qMED_ _F~+.y2Flݼzǽ2e=r" rB*^HኑG+=Bşo/#REUuOEcCp+[}*FG!p#,^o[yZ"!a9"0qşo/#Sߋ _F,3Ă21w|Ք%i/$.aX%XTrFw@Y.[@M5;~-&Ckuv/|m6i \9W=h|Cu5pLLD^aT8zEDĿG[@M56uTX?wƹuiUNHI4x+W@mQm:2rrO'%j>h8z'%j>h8z_ _F~-& '%j>h8z_ _FOxƏ n+!MF}Ew5'$]jkp/XFfDIKڹ2=>/yzZs9lcoZQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE7@w?Կj+o+lPEP\9 VW?x±tQEQEQEQEQEQEQE|GC?h(zѲ@WR٫WA@Q@Q@#։`iV| 69Ǧ}8Z'omT6Lv2 ~Cg>f7u"hwsJ9FBW$⹽vmFK1,$[f;ܡR{g5(rvW4ÚjHr۱aqlL|-b;kgß SDk'IKșiF${j׊kxQ<=֟od1CO5tħ-qO,64g۴^g-hO5޶-T઄XDI5PEP9hb׉5:e㐊,ѹcrI$&)^'$wF̠lpHX^;y_]覮 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (9<RA\?xkV)k((WA\sa]KKf ( =!V?"sşHh(((((((;J`lQGCº]s u/- ((((+<'aY? C! VO"(((((((((O|K`W?'%Uj(((((((((((((((((((((((' *E-tI熿k (( ; _[5t7@w?Կj((gc+Z+` FEw=?Qho+lW?WR٫((((sH?d+((((Bˮ BXMlɷXdq*u]&V∮ŚA&+yБ֕郞 )]{gmpחs%B#Vbۓ?*]u#KXe`E En~IVsʪgztTWk#PY'H AbvDWXHais cuäڍ5i%-9gI:~jy6)H9ܼ+ϵ[ıv X vU.q?( 5k{kSٽ鸸 #^߸sm"jnx$J+k 4 QbGu:!:Rۖ8MW\&յ7WzLpK$Jr3jO@yEqSx]J꧐-C$,p@hn[ T*(6˶7w$Ŀ M]yw'ʟKm3GOڊ W hlt72X :*( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (9<RA\?xkV)k((WA\sa]KKf ( =!V?"sşHhҼK"eA8?> (mY#n)U{{{MZ"m#kW+)ֳ?izE]bY 6̑ :!U)GJ٢X2R# QEfigRpҤHQcÌ}y<ӢjzIg78 F8<>E\(?h(zѲG%OT6Z( ; _[5t7@w?Կj(((((?d++<'aY?: ( ( ( ( ($1̡e+09>((51ס*|"/mg_(w?Q ߃kcNGSBJsAo<+ W3ј@ _𯋼/k,'FSŕvt"(W51ס* p)Oס*NC^)h'~C?U?0U){@2; z a51J(ew?Q ߃kcZQ51ס*() ߃kcG'~C?UhO<6\\K0ƥF $d\xBmRѬhn¥A$dm(RNC^?; z anCX4Pθ`- 1}ֻY\=Χg h^u#%;x<Է@,i%u6uBJrHRN2@ϸJh\Ú."oo8#5U ((((((((((((( $_ K]syZ襮 ( (9º]s u/- (+laTBCH.F>n8qAnk+&[, mha0uL/ `m.݋ fueD0P1:`h_֝,%[Q9md_%ȷˑEEʹ \ظ[c Q#23YDb5t!pwtPG5Acyr8s$sƲDkb쀎jD%5ofXgy٩6MK !%14Q uM1[F[xf*H8:6k=esN* ;ل*p1]-t纯+>{XEuⰄf; . #u*EA/Zga/97(c}P|K0jG[E,]}<ߜg4Eg?4X}^n.157*3qkEŝc-հc<1#<@WhB%Nu!`囯'fj,t{ yk,d a|Q`Sv͓:,776z\Zq\hWrFmN`I3-FU#yldhJ_5];2̍,^jnG &F>75KaxDgm<0-(Ufya %vk~-jK,xcexJqټC۪4Ɵ/r@pPdi[WWܤiA J!"4Eco<6S?3 > ;{;]J )ǽ"| 8kcudq~$R-Pף-zG-2ֻ;g%}TƵocivvX"f( 7ۥ#-{|Egj% R{Ψ_x[Fo'au:FO C!d!y88➷Be':m2 [ di?LpYkH%-3Ki/.f[xnyD`ZgI{tx̗;2A|1$'9w2yb$X.eLt`7c+;icF:,P%e}gZx7B8b{I|Ku*HI6%^O`К]oRE#yF\ڎT `z34iU/gKi_Nhy76d`)ͧ꬗r(2E`n?(8:.ک;n}ۜgXOFӯχ"-ԲA;Tぃv/⭿&fKyC"m.5 [I]*wildlV8#8m i m=i Q]Gj`;\uk>׵ۯ k&646mE*s?]DgǭAfzҨU R9 >Bvl"Ie]\̞/7ma:GeFEI ;670 t (((((;J`lQGCº]s u/- ((((+<'aY? C! VO"(((((((")kxW+/t1<#O̾Z;dMm FX4j?z5k ت2Wī0J:09 dY|>MQiRIL, G䞻{wjFNW _F]hH%u-k$ׂB& >lz^1SXO~eY4l;J4LEߊ _F EE-?sW^KxH:?,R.a &I-)c8L60~~ZBpGv-ҫ EN~,.yYxm:G-e*9'9MRRR-R$ʹ7nM7ÛFT Kskqk)*J# ۴ *(=tko4OK}ſ?q/#Sm_V_bS\kq$omlX^z}eK4/8<:Պ $_ K@Q@Q@Q@Q@Q@Q@ye-z$vʤ/%IfUOR3ÖW+Ʒڄ) r]og/ (xyhD'T[[\ypī$70pdqUVIWp4B"xyu2gsj/[=g +D x s-Dž4kF@T8;c]:XW,5S"yAOXxZL-M.'A!;ȭ[O4'l~]̱;vJ!vqiPV̋pƈ&}a;s4iqkc>_!,s\FײZ.[`ͻx c85{idKtJHO_c[G -eDpoRljv+U/bP$x\啰r `ct_A*'Sl-1K"+w_1ԁ # U^d-Efq$\sH:H،`ﮇy39~^@߯4Gt%".ٝJNc|u_אuo{v8b2';qVu\%A[$![ycPJ7"W*z=*i|;O%h)bPe|~sQ؊n<2c0:MgmDMTpH->#iK ˗X[iXᷬ00#El}"^%đ2Hn1bN䜍1SY66-FnhiʒN ҍGLm :ZIe%ǘؾS ?\Mymk%ԓёX .7na՝@' Ka忇綱BSg` %@~nI5$:n5R) P d~Csxbd CpcsF)tFp l.dcLH S4IDqmˀgvAЏzLi kk(3#퀂pn'<Ši{-yb D(Tojp - 4OЍr1mlW,ay']F x?_!Т* ( ( ( (>` FEw=?Qho+lW?WR٫((((sH?d+((((((( [YxCgOPҸPIp2{H+")kxW9Bs-wsC4Q3f7yv+M :I 989 mWVA2E*˒2Ҫ]hm2۰Q^Xx$*Ad9*ZwkIZWRXyBe`GpyF;V3njfIJ 7A%®\Է^*y쮭9V7g d1s'֟y+y#-p\aFY]A8$g皗0ĩ0لd߼q/GME=ų@4HBаݸ <.eD,BM\DCp(-U<3ʑ#?b/-gQu  >ٔp5䲢0 gpmGM\VVLUnWGth>K}|Òpqɥ7[!oY#ɱ>flַUM$QX+ؐzJkk ۦȗ8\4jTNѼEm\Z& yz#k2ŲHv8ԒNd1mu#9PT0k6_S-%3Cl֨w2='ۭ&FTЬ$3jli|~gٌ]Ud֏ե'$ a*Z֚-F9ZE$y%rv䳱'8[EM($D}8Oula-&K嶚`ivv6Wo^sZ ng ]1eۤV*Sσ/%%fYDi 6l3 _fM!m>m:O6+6n&o}u74Ie{+k%1pD}3|;elۈ .jQ ? _[fGI7CLyP'֟_N^)]N}^h,XIbBtRy?浭!i֐M_ʲAhD+CnHc1l[ hڅ7̑G3mr0z0Lw- #ƒҏ߽bG+$i|ia֭i}-k-DBrd۷'d]HWj&l&I,F%|K2`;B|%@_}J 6l;7> ՅN-mḴ$ liok9w4:dȢHaHDP3ҟD۰t (kǟ+X\5y"] x?_aТ* ( ( ( (>` FEw=?Qho+lW?WR٫((((sH?d+((((((( x/oORcnI2[CŚwk?%T0O id <)4M92c ,ӿY-Y϶[5[,3Efc\Mzn3@7mcźok?%T7}^񪙼Emm,ru8'  i"Lr"B[s;RAnw CEw3NjֿIyƩok_$Uxk_{r,g*BK2zfSsw,pfb< U8= {jvn$O [d+8{\r;ϡ 튝|>ӭCMyiOFZ}\?r?{-k (AEPEPEPEPEPEPEP\/ºM]p:+qjpj ݑnTw6%M2# IGh#yw;12ԓ8ۯZ`6@b  q+JUc@"?qv>DB¬_csvA͸[’^~L16[\GB8|`gW˞Vd6HOAסϡEs r1f(-V;a1yF01cUKZv4fGR1e/ P$rgI4#nx$d {ZW*5Ooz\H0N09E3U'klⷌltH""D4#0$I's][-)i-"(((((kǟ+X\5y"] x?_aТ* ( ( ( (>` FEw=?Qho+lW?WR٫((((sH?d+(((((((|"/ms· 7R;i ^>ea¶t). Y4 ]^l/Ebx^I"pU[Y$V6ί$D!r?L$LK6+pё >Oԣvx-hyII|!.XيOU[i:m=i HUfny$`1f2srx5[Ka ^ZF@#۵ݚsr>^FZ}\?r?{-k (AEPEPEPEPEPEPEP\2Zj"4go$|77jTw,ZūO3ŵHN7(N:V`Y&il''0VOȸژ3x [Au>}/$$I{H~T8?mbG M]#%:8l+G+ CCp8UG݁D2,#eċV,pA' g]gjq{Aqimsv<-DJRN-#%lݛumݷn gj1}Q[_*nNx85b]2L6yp ; <-j;k/§.`|~9\@"&v%wosd$U`J}YNiQo RA U.gVz齹d+[iBgNr0!_@jI9\N<2UDĈ'+lv$="nm,,6CX'[$#G4(@(((W t:'FȮ?!apCkXlD4(B((((?h(zѲG%OT6Z( ; _[5t7@w?Կj(((((?d++<'aY?: ( ( ( ( ( ( (<ֺw(!]6/+򗌞3[zviGwgM|YXOi%}m$$L;H񃝤tuEs[Րd-\ cQT|~̂{Z)D$Ag4l&;'np0N2(rLV tSj;D.nWGxYO4 9 2n9`xocGNEtNͧi22J)~ޝi=˻ .D`nD([x$di#'}=Ccb)h%GE`$vz.ob5mJ ߼;zsiW1uy"@ؒIUSr 䟽jT {-$~g9#>ҿw\/kqA-[==ń`_$$9v5tmb6K>}z[1 {Kw ynʬc8$pϡ7:eIwk(R,ʠܒ{lu+}^mʾewI7A|K9*rxR5ՖWCXV,˳'VW 2pHJ(G`9#9}HQr&s~jr,Q3I-W@~K 0qv5v Ew`$["0 ;NGLu▗2~8mbĖvqk- $f2&ⰸ1W#<Ւ.ë,-i~]m5I09#q;y X-rwHY󃱁 :n"Ϭ7:\$[0Us$ 01㑎ښ(DW ?Z|BtqQEAQEQExEqa +@#\?WҸk? B56"[QEY!EPEPEPEPw=?Qh*?- u/-  ; _[5tQEQEQEQEW?xO²tCEu@Q@Q@Q@Q@Q@Q@Q@q᧻ΆP,LڲP^[lVΑ%\W%uG-rr1gx4&I 2ؒ:Ȋ*rsKjSY-Bthq)=A~/K*[Mwo6۱xGjHH'!{MvB(%dsZ!A3y#?t\ >CđX(+rs oo# d\16cn) W1SZ{k%oA$d}E|<_iPp gw ptOM _j֚5$"??T#czouO[I{\K@c+gmoDU' H!s޶±kd5 YOnb.q#zehmovrF7=D!s[ct?MTxCOI3ݘ|7C9Y\ GbxCJ٥CX }0sDkǫ~&?;oJ M |5{/ Y;!A>rm"detnUT ?;oJ~/i*pA>$\`5fv==;O8z|Pǚݻ6^^μ<Ӿ&?;oJCUG QC+ljN] s=jFՒ!389gHde:;?wC4GaAUr,1K=:˅Wc3oD/nEHmnwHb>^?;oJ~0i* I$<&H2OZ/mlQʡ1WT4(; igdERn@ KKQӵkn #&E@Im9qYZĒ92dz:_ﮍǃ,eviRڿ*?7¶(o-59k8 .T1sMD*;Va[66BŘj$3{VQYzq,`9L0 GYc㞜V6-f[ Yrx>VKqY}D; nal=ssZxz+J2G/,nU۸q:Mv,yؑxrF##1=MOKbj]cYI=& wF*|LvN|;[y쳬%"V vn1}VG::ܶŹY•ۜϊ~pcv )08R3m̛KN;(3Ÿ+J; k:inmaSnj#aRf,w1tԶHo:>Dav"#.C :ķvIt-z*QNR'@Cq*Yl v]|[<(+#k}❽>m^o3%sg vRvEʖ'<1?Q]HJ7ZOͦxRR Hn{ڗ,XXB6UR[!YPN19=A/wcWAmf43<#% +F d _ijD$znZji/b(PQEQEQEQExEqa +@#\?WҸk? B56"[QEY!EPEPEPEPw=?Qh*?- u/-  ; _[5tQEQEQEQEW?xO²tCEu@Q@Q@Q@Q@Q@Q@Q@s8V<[s/u /OM/N9%FFrN1D=Xޅq"JeD1PO4nXĊ Y#d ?#5ؿvmIBтĀ +#Ha3Cklt$]~^ [$[wiac=܊쐡Igz̸DvS\]X[S)^ s&1xBAKHŖ;ҭҝ5,zmgAFGsC8یc 튻 ]G ^ E)5BHJ9`I$c\w^6lR/G,2:2 4{ =G XJz%ԭxV $]$Kp!XmH8*HOnM=3,e {&*\p 3*uMqPO3cchIRX( 1,"]HxeA,X$t^B=ʋJ7ĨJ (> h 9i_m`$arڼEY-/~Lhvt#qZ/R*;rK6-B SV+p"2#e-h=*4c$Pi ?6vFzqd1qcdUF$ĕ㏾= xMmݕZ&f @8@3Kcj 6@Gy]!0=2rNyx6ut}I'샏q9k. 0ECp G;Nqh"54eU@ ܩoiQEAV ( ( (8>FZqwgkjז0Lч<Q#`k]m Ȣ(X@Q(GSѴfQP ̇[pAp¶G )R]9bI'ܜ}QEQEQEQEQEYdIT &|={f}Fxnx-ݝd d+VCaonl,w,Xy8]F|nU`y~k.OU0y4B9mNB/ǎLyvՂW:IViz{ٖ1n2}1M&;A$u^agO~Sxk}^Inͤg<9³PgT]3\Y^;XZb锅Fo#ȣ}msBVC5Hy5rm2)⸱; 2I`#0: D$a[sF=#,Jj qIKkkh1f5Bz^DXQ*U ( ( ( ( (9Ȯ?!apCkW t:'FKsB($((((*?-~PGe=WA\sa]KKf ( ( ( ( C! VO"sH(((((((h M:e %EBT`+]C[)s[ic.?/`ϾkgH.e[;"89f9i}R-oռ.R# U[2J$M~0#1ғX{{,.~o ӽa-oO;O-U6hrs-{ lI-ãXCLF1œbM$Ib๖&%9(8\XnE%c}a\1$-Py༁n^xEԑF02qW}Yj,5VMBv˜'jƧO+>+$vx2Lz׋W֌\\갹vIL{2*3Qz}Kd],KaA=5?Ap-h uxa2_刈'NrRO< Q?#V5k)4$/ ::OZW:Ŭז-yR$`c*8US[V*3Oe37[y-[/^ >~X#Q,4rȊY71Td'=EG4Q- BmeP`\GGJw-:nάbPt)ڭ[zۣɴgj FņQNp1.,&ҠyC+[HVFPöxڹ=xwm:;v($66022X3U<%kq{xֆC,vhrwgI/=8X!k [^ PG#R^@ދFym"}^Ԭ2y`Ġq ]>#KyO"T8rWkMCsfV+(U ;dV/nI#f+`o7?t_EiW+nL3lĶ1eI#h_OnfY. B&z]qmWyZCnr0X LtXLVH  }3ךKζ6k 14n$ sLĺTM20X m*8R\ۜ;? {7]}J6+1ۻp+,a`4 $(ᑷ+|͜sNv.&iV$myDqf @Ҙ4. ˕A8|aq~7w7`\Co+I;ךig<ټč)Vb4Q9 V:fP1IweA$ˀII2xkfyGH\'i } V|oVi9H*U@P226i-tl.t </ sSAQPhQEs^<\BJᮇD</=,?tOЍk QVHQEQEQEQE%OT6Z( FE{sa]KKfº]QEQEQEQECEu]s!+']PAEPEPEPEPEPEPEP = 2ܓl'&G"Sd\,mu SmRT 3/8(D}r(Q@Q@Q@Q@Q@Q@Q@q7 -SMp+I!/lnfMvQ`<Ū_fF|QC|Y Km f3ʨ>g4A` &4ax^+!ݜ#^)U,x-W5?caѵkދt8UyLbM;,H{x y&GzǪ_fGYC|YU\MHurHʷ+IRv[v\$ g23\uivVڟXC%GMGEcR2?ſ2jτc=f?fj֧֓msI!?w# F@sY`MW?|[C&~wtQdg 5_cho 5E]'dݏſ2jwEAvp>-Uv?fɪ߻3]Y>q}wV4S\Z*F뒱JKm6(]{W(aQ@Q@Q@Q@Q@0~PGe;J`lP7@w?Կj+o+lPEPEPEPEP\9? WUW?xO²tQEQEQEQEQEQEQEydžes .e#?ꗟc"mCK{Y-r'>|?`o+2 믱Xuz70>Q2 YHK]8I!F\3d)ᔖctEUԫF# ,,- \m#x_˷ E%'95km+xQ;,qxg7o;xHU/^iHA,Mtڅݬ-1 @8]IM.tOt<j hmhMFIf,}I46j^2kKcsk`.̤2i_  n/2X]vy|!;^domp]OӛDnc}.T^D?|OJRDKB6ҠqzP밚ETQ@o?r?{-k9hіV[QT ((((((((IsƎ 9{}O.ϴ}vgxOƨeiT@UUG Ŕ:& $o(s+[JhIcxSY9p[jni=ɕ:2IU]vFڶ Oi:jL s+F[de&Hk#]`#aan]TӾyYBY$Oºo@ٰlT[v U;zq$JO6#6ҹ֦ ( ( ( ( ( ( ( ( ( (>` FEw=?Qho+lW?WR٫((((sH?d+(((((((/~^`hZ< WNUoU^븢8U^Y_.(Y_.U^븢8U^Y_.(Y_.U^븢8U^Y_.(Y_.U^븢8U^Y_.(Y_.U^븢8U^Y_.(Y_.U^븢9 /N1V]Dbdv~UEQEQEQEQEQEQEQEQEQEQEQEQEQEQE@v++l4QEQEQEQEQEQEQEQEQEQEQE%OT6Z( FE{sa]KKfº]QEQEQEQECEu]s!+']PAEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP\ma]7Kaºo@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@0~PGe;J`lP7@w?Կj+o+lPEPEPEPEP\9? WUW?xO²tQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE@v++l4QEQEQEQEQEQEQEQEQEQEQE%OT6Z( FE{sa]KKfº]QEQEQEQECEu]s!+']PAEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP\ma]7Kaºo@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@0~PGe;J`lP7@w?Կj+o+lPEPEPEPEP\9? WUW?xO²tQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE@v++l4QEQEQEQEQEQEQEQEQEQEQE%OT6Z( FE{sa]KKfº]QEQEQEQECEu]s!+']PAEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEb!W>MtE{ƨI}oWj\&O"TkϾ+5Eh{]'}^hv\\& 1!y$DUE$bwp:Z( ( ( ( ( (>` FEw=?Qho+lW?WR٫((((sH?d+((((((|77jVЬaœ))OONNOO(3Q1d(2;@<Z$2v 2X-|Ēu(4bL@U5iP|l4,$)\rv⡏@XXBƋ ,r I^Saty 2)fM+ $I Sҵr+ ^K$k-.i$,@Mᘓj&RY}Kxd-{ndQ$g`9^rHjI"_iWK++H“=(EҥL{U o3@FT}(_ v9v$+v\v?(,{Wqk񝥵v@H"@O$D</֐ؙnhQEdQ@Q@Q@Q@Q@Q@Q@Q@Q@zxkLi&H[B$yF|QFgv#n2 ǺҮ?m q[jC,;L͍)gG=E|1N9|ƆH vݲLq|}w{m=4k$isI. Ei&blZFTV(fq=k2O V!mj66Db(VAbsX<Ӣ$hСd~nNG6͓|,RFrHR8;G8L> p$Efب@9)+Qnau) Igbvv-a] sp'$"RFA (MTlp-A>a*\cY'ShgU;"q{9jT!{Y|eFF…It9d'goPц8!@ԓ$yj4<0  QvUU9!z<:wm-d2t۴NdhěpT8^_ YKk$hQ$W1R݆W:Ki}b< l.F@"u|zf}ĺ9{ELިaVeݶ8N\0y' Y`2} "0BfR 3V+).䍝sW5%ʦX8x'`F dklloL IxN<1ltWwg;7>܎A!O8 No܋|֖l>F CFc\I-N@Ia)f$k+b3 ( ( ( ( (>` FEw=?Qho+lW?WR٫((((sH?d+((((((|77jVЬaœ)YonH߃H B)%ռC"Wp p8zPU+2Wg(XFNcҞ5,љCAS @8<t]os sA*)2=A(c[M;& 1}&t.kaA7y/q((qjv"[Ht,$` ,}O ܬTƭ $)>?LK]L\2;r0Av Bk[D7~]֦e,G`@O׼L[ .Yr+8KN;WAss V.-)d9Z4Z8ʂ;qVt}A-YƈKQ.:}zn`foAp;I=0I<:5d+78R 9vkbzFOpHVv}lam&L!#i ~X|,F3#mᴷ5 ơU@CA+$ $l2 b)TQ\ƀ%(W t:'FȮ?!apCkXlD4(B(((((((((*F_J?#AYv?2Qj [- ppNNNNNNNNQEC\t+@-oȁ 9U "7Y\2UC hew^-hǐ΍ck`zڤ&Y$i@her2ݹev{rZ10PHJH8튳Mٯh<+&,7:[Z~2baɓǗK65m nj,,"*#Z! ދE ݶ$p [/7Oϧr"@N6)vUP3͓[ϪxfVmf%wnoa͑Sq P[!qeF (//c>A4F[y o?+nH}wW2]Yߦ6܋ RHA`@85MJm)d|zx줉\(a7}^pn> /?Sm^wmc<_.57鶦7 u20جO5?W+-oxce61+I ,N!7}^pv> /?'v>àx\\5'!7"sFe3(ޮlI{ƱbP[ H䜴r ,=PNjֿGyƩgk#UM++[4]jiImo/đhZ%67mkz'[-\OK*Z*ID_^ \iRaϮ;5JV8m_cv@C&Ss<;^|C&8H AaX ;J4;߿'!sL4G{ƨL]owj5_FbxCYѼ/M7Dֵk7RcԢ2#c)`Ga?|_--ެg]` һL4G{ƨL]owjmnVJzK}Wo57r%rKqn1dOXR-0&D+;~NeäL]owjL4G{ƨ io+𵖡s;k`2\Oˎ5X?iQ >-G?WҸk? B5Ė7v,Xϥ]BQ] :w>kX& 1@bI<֐؉nh7S=m-ˢaw>q /Il \ZSmՒr6>,otR H!n$r5~/ӖIծ%Do,>o*:EuzaZ]JܐUK"dt8`Fj渷}*ڨ[yͲ(͗ ]qv +H1@\L[m3SӴQ~m*c?tPݸtflՒ9d V2Hݱ($3sCw65Ȉ& ۂF:`G^~Cts7:x4kTH3:*8*cqBxCo=Ξֶ9Hm!6`I y'FUm{T-SH@펕e7mo0TTpG!HK9c˻doMycv\FU-4 &K#Mrlsa(3>.ew)R";`ā7]Ю#U[-AwȘn9m >~4 x{St5]C|#.,FN+W Э/&s\UErx?1ZvBFV*  Э/&p:+_+h/ Э/&8rU/O?V?_G8rU/O?V?_G8r,eW;jM7U-I#Krp'P-l8S4S +n~%ǨkQYwSZDp&f=Nw,d b8S p8yUXj7ךDR[ʆb g#!G5o}jGVy㺂Tդyf.` F z .OK-rQYs+͒ɱr2Y=yUu}F=: t,I?-J~S#s^)•đZϖ~kq庮 YPp1#q O[YҴGh^%r[;ї{p@U-yy[_-=;Eڭ/;Ƥgy]cC< u#{&[ydV0 !\ ƖmGHx .-MŠ|ّA'7p3KJKW7s$+VfrXjo|qjkZ[{iirv5tw :KU*6oe\#{][Kzo^Nฅfu{ 4H ye~siCTЯ@ZEK$^t&p;O$W^?Une1er$nRA=(MipkMnl!.,n#=|N=cW4 .RR1}nc&9;R /' VY'?+B??uv8tP?~u17z~5aQ@#]qcF(Tko +[w6٫jS[+lQLAPO$pSvWW)mju;HaYG\Û!.,l aOu1L#}k5RUkHq17/b͐@/j==G `G^awdI>SVvKƋ|.htSA䄬$H`0N^AYWTET(g,-ɸofCc'OnŤ2KqFH6 ͍zOcQ\V_Y(m5fqBm`ӣ+4R$zJ@>^@ ښUVKoɑC7* >Avj?8cQ\V_BCr[&u7FW3:bZIAAC99cZzյ6SRtp uq5ƣC~F5ue(]WXMVIm 1vN^>Ю# جO ;Iy1^ ďzۭŠ(((((?h(zѲG%OT6Z( ; _[5t7@w?Կj(((((?d++<'aY?: ( ( ( ( ( (8 FJ$H^f]SQ"8ʆoɸoCԮ5;#5Ŕ)k7Lssӊ{a]GK&X٥cUԯ^d%Y$HG}Y[C5KWiLr;sǰ6[}_QRXQEQE!!A$$Eqa +@#\$I+#_e9y=@#Zb$hQEdQ@Q@Q@Q@Q@Q@Q@Q@Q@E*xldxv.隼c{ ard`|3 2F_J?#`]W]^V&LuxSN~7'cJ/i0-ct2dp˔GGZXu a}Ny}Jۣ\ 1N:C FI1#$DB]pH8*ovkX<ѶxۯZx/Oӧ3DHX$n؋䜓s֫ݹ7c'.f *׈tq4Umbv-tjLs[^8Iwe.==X m渹h icfލ$vO5*ԩs[CnSi݂H| b0#Q.g bDtF]_yV_[k4ic&SncF!&2k`=>xhvmJZAJ y!J.ܸ$V6sp\(2AGUx+Oӧ3)9BF툻I9'=ksk9\$bPHv7R߈tie%y$۴S[oZ=דU'[yʱ F'hz}tk9.Z(:'X噷a']]Xa&n27J0*΅]빱ETQ@`I?uOI`ixoASlV?'u?VndQEQEQEQEQE|GC?h(zѲ@WR٫WA@Q@Q@Q@Q@s!+']WA\9? WTQEQEQEQEQEQEQVLjFMzqYn/ebL(,OUz瞜UM xmByHMSQ/$T}nI=+CJ,5kUbEb982=}Kd8!y#gw`Ԓz mVXӞD⻼q*9ıaۯCъl[Y0pO?2)!]λMp pNLjeqsye},i5 -5p2 ic) |9L+^miKe#I@bB/lP"$2\ons3Q]`X]ac%]**rTSw\\Zi|v0>|A(a]N[v!s.׉vYT#m ̽y%׉lIkG9 g!d+G;s.an[ƕy [s4[cXZ=x=GK [Ed]@ j |tҕ7L,`7b7y"+㺰hWd1N#+Bsڒ-zͣIXĨK2#l,'d&b{yP@o R[n&m8Z=}x_v1*~ ro5hq\Y[໒fi$S*$Hp{洖6Xb)|Ѳ*F}6K#( %,\RO O&fZkf`ycyNGPX$Sx/Mgf[i=vܴ5) # 8G=1[xkfyGH\'i } lv2waûbFmBɢv'FȮ?!apCkH ZТ*QEQEQEQEQEQEQEQEQEq{WQOtyyƲ#`p3u#ghWTo Ϣ|_U#{O]\٣Iy)rs z >:xm>$)ev ǣryO}_jHqm$r8O覣 Ӣ/*)U,x-W4(16)̞|^^y<FV9m8*rG+tq"ڣ(>ݹ۱qTW zehs_1ŗBIledM9*G9N:\WWSY>Ҳ+*+#cP;_?c/3N.Xv:+>ˋyL;ۗijሡc?v2 $uGYC&~/dݗ%OmI)YL--{`*ᴙ&[Jffy* Wj[qr|[C&~>-Uv?fYn.oi&q;˰G gsVn3K50 ":rdYuWſ2j5_chQMEU2-bdya(qKo ;j>onn b f11U|[C&~>-Uv?f-E$Iw5@{ Ͼ;V ~³Nm@`)WFRsT|[C&~>-Uv?f{ -tl.t </ sVr>-Uv?fɪ߻3CVůȮ?!apCk𧈯oSYU7W\67(EvT[iE*uFsܚ!7rQT (((((((0B,2fO~-ݦ4=h;C5S:j%vqoqzEQEsPo_J+*FWA@Q@Q@Q@Q@5=H֖5t+&1un\nмYѝ!"V_[nf8=뼮gc+Z݆#HB$hUT EQEQEQEQEQEQEQEQEQEQE|GC?h(zѲ@WR٫WA@Q@Q@Q@Q@s!+']WA\9? WTQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQECѿm+~J`i]QEQEQEQE{C,Ek]s?+ZAEPEPEPEPEPEPEPEPEPEPEPw=?Qh*?- u/-  ; _[5tQEQEQEQEW?xO²tCEu@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@=W6Һ ? ѶPEPEPEPEP\9 VW?x±tQEQEQEQEQEQEQEQEQEQEQE|GC?h(zѲ@WR٫WA@Q@Q@Q@Q@^ + IVCC.Fp8⸻wQn<=SXkkkxXgF6T3 xK]WJq:<Ǡ`dnOfjdZ +'s}leED1 n8 yX>-o.#_NLP"kzAEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP?y%FU(z7mtQEV=<7^Ig *@$A q ՗O<"p';T7}GsE?'k+:]oH4J[7 "-+Ű|ͨT),UXR]FxtEo>s;;)FTd9QOН/H}GsET>/VE6U()0KC[ofYrZxt;o&wse#c9Fgqy@AH"Z4( խaES(((((((((((((((((*FWA\=W6Һ (+_H*F_J?#Gs\S0SbYk>uIplŌ轺g>Օ-.A楝]=5n6&ȢpA%Hƒ;s[_g7nxBAS# Gi=[xɖ,B OM^iF^;iAoiY9 ӓ ;`m-nHt+3nv9 /-5-<%KJC?Ye1Yؒ$KmM[hlTC-:4]^IsמyZ|C09wxlыEK": sɭ}?^Vӭ >8U189^7*?DaZm,PZ;ICs,r6w"|͞y5w.j2cA/D9=Xp KQE ZY%ux >/?JnL(H ( ( ( ( ( ( (>` FEw=?Qho+lW?WR٫_Ǎu,|97jTw6E8SE8VE)š)€)E NNJ)( pO܉#30p郟QEtbdfa XAqᶒx!]mP@F5Cm;V6B0Oy;;_W٢FI'uRDQ n d)#H~Orl(~ wsy]FI70! 8RUpbQc><ǐ^I>3O%W@(1hg kYKۿam:_ iSw5*%Čжa`OkQ@VH ~$lzU[ETYRVDb:A+cEhN,b K6hYKHrvR[xkKx^( M笲]$Je1 zV4(  @H[Š( (((((((((((((((((*FWA\=W6Һ (+_H9> tx GWGqr_ی S=P+bfX. 1 .w!p m>nkCP|zo|LI=qtj mV\V(.D98Kw3#QK+-BavC 92Oh~Kt&5 jKʩ&%8e\/)C>U h>/*\V㏸|xranP3J($@qR dVoYZ_ZY 6y2PD}F ԏKTN<%CNַ{2oqjK>?^C8)PCct[K鯜Zh RխǨd`dy?8 :' "_40O_o9Yy`]E- y-͹l r *njb-L"mlѪH+,G!qtc]v5SWQ=nſ9^ Ӣ/*zm_Cz/֥_IW8 :' "35ż42_rFApAR;( (((((((*?-~PGe=WA\sa]KKf |97jxWQɪ'Q\W/UnXԕv-c=˿(u>bZY%fԴL AedB85WKE38WM-֦$6,b?~urX1ִ5?xCpE?tyF/,vz:coCI+v;J+Gl5]{hXŭ={6Lry" G9%Ǫ pj~#> HS {E#wd#l9bZcAj=lvg%dߙ@`:d'nm‹ dfmH*B<]UGGָG,lsNմm.[.ӛx_(ᢷdb\*<{:${gDTv12FYXk9o~!{jvſ?Q/$ҷUOHͥ D2mޤyJr={PIw 4Ԓ[dX#i T(9GZ$'3Y^O;odNsGNo7ZdkǴ\~P8>:wQе}",4-GN!`{zo7#=jNmdV}>yZ[%V"$iSK{)wu,;IQGy.z;5o@Zz~?ce/Qմm-l&1. Sjl<)20f+8p&koW_%o 8QMN$ov&cO3ZOm >Y6Y>(Tu!w v=sh}Kİ`.4`)'sUe[k2m:VSKnrMV-lhT?Ag)_0zm珨k1ٵk-ii|xN#(mv͵$7,2"$"9nL$Zn6vsɭG..iE$D̹.,g\ߌ.l!MF 4:m,rbZ|Jlr"U݆=F{N HkKԓLVqUqy97m|R5蝥+mCݳvc<{P;HXY1F#$}3]_'~C?Ubh?Pwh8ko4OKX +~-&'%j,DĿG[@M5z/֥_IWh8'<u AOJF ( (((((((*?-~PGe=WA\sa]KKf k}O_i1"PvFf_Ǎu,{:~]&Nռ;g6K{#Rzd#U)cEpha[*#hc' 5(@珋)r" !EýTHv@$=O DŽh?a[)A4у DŽi?aG'D_UoQ@?xKTq/tOEV DŽi?aU|UmJo[>7C=N5QFr:nFiK-be[ſ35 DŽi?a[S?xKTq/tOEV|)}ix\M@l bpÃ#BA/A]n3{QLAEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP\MR2۵vX Gvب?Iզ(nc0>m$a]F=:qPFX*;>߁S ۡJLX|Fe G=$V_ĐHX\Z>kcV@v#p=ܠWUbb2wTv=Γ}#|n.$H+ld``)ԖwbHR%/!Sӱ'p FKh"{EHC,!w`u0x{NaU,,WrbH#R5f*"*u mӼEjܫ'cUƝvc l 3FJ1aϨaAo Y.a2, 24K+FYUYX|Ö#=W-g79fǹ$4ݺ *h\RCK$/֥_INGsEVQ@Q@Q@Q@Q@Q@Q@0~PGe;J`lP7@w?Կj+o+lP\ͤ@ͪ KR7M韛nm,G׵Xk-XI )xcsRjegsN5)vros)Υe TGjc1jŗŪ_fls5<)tt@6$DMf-$ƨȪHNqg?1jŗŪ_f6x>3}+X>RēnXú+ 0w÷CV;7`Π~Wf,w?c;Ū_fFUC|Y^KI]ʳx1K{[2[۬UYF%sԫgEMK{-eh%EܩRb@`PFxXs1ŗw1ŗ쵸}ne[ Ow4rݥ FK#BH .Mvq.lg'='9>z3c/3K?dݗShrI>7{hdb"|8g T/YOnױٴ0ܵ»YcbX\] 9go*Χ>{(ˁ9I7+|#<7dݏſ2jȆ 5qDyFÐ~V%qgk_]Et\D0y7 sv5_cho 4/S h:%,hM2#"v As9?|[C&~>-Uv?fJ4\dݏſ2jG_Er>-Uv?fɪ߻3G#duW!5_cho 4r0G_Er>-Uv?fɪ߻3G#dA /Vk.<1jE+0)QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEWe{H  ڻj?eW;jTwFX{éA4m.b#26^=rslNҬm0`Vmܤ|@IQMt?%\?0{b7 -vUe_ x#3ا% v,(˖CpciwwiCnA4סKnUKk*iNܞK\j#&&Ԅo}D;N_\ly:.#EfvßzЩt6g=as,\K,o"*@U@H:t^OO_WV#di;'5x >/?J.\hQ@Q@Q@Q@Q@Q@Q@0~PGe;J`lP7@w?Կj+o+lPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP\Mj2J0A}ڻjl_,F'QܛKд"Y䱲8p0>Q88&Echڭ֣=\iڬ2Vs8;]VȬ6sRfYa)#?u g[w{;Gc@y><,0A!OI"9c |ălN1*xU̫"HF~Rح 8"Oi k -Α|f*pG Nzl,]$LZ` 瑞qڪA&%<!iJF$ydZ0난g Ye.np_(B7wgp4>gkEnᛝ2);ϙLe82Hq[qHt䶶Ho:>Da6"#a#GS=7ؼǶ #%|sPK4LI#.Wpgc n(n[TabĖ=͔3mKQ*[$O]Ebizݷڣ!wg$?6NCn<ۥ+Rowr^K,ZY%8n9QZQEQEQEQEQEQEQE|GC?h(zѲ@WR٫WA@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@qV2Qvk~ 5ٚG.eI ;ӰO  ҿ]<7@+{29KfV/|_Jlz&Zd Kn 1c` FEw=?Qho+lW?WR٫((((((((((((((((((((((((((((((((((((((((((((((((((?h(zѲG%OT6Z( ; _[5tG/r=CIյAd_e*<tWyCI\?v<$?z~Wn]?a+7@Ey.߇0oJQ^ ?%qtWyCI\?v<$?z~Wn]?a+7@Ey.߇0oJQ^ ?%qtWyCI\?v<$?z~Wn]?a+7@Ey.߇0oJQ^ ?%qtWyCI\?v<$?z~Wn]?a+7@Ey.߇0oJQ^ ?%qtWyCI\?v<$?z~Wn]?a+7@Ey.߇0oJQ^ ?%qtWyCI\?v<$?z~Wn]?a+7@Ey.߇0oJQ^ ?%qtWyCI\?v<$?z~Wn]?a+7@Ey.߇0oJQ^ ?%qtWyCI\?v<$?z~Wn]?a+7@Ey.߇0oJQ^ ?%qtWyCI\?v<$?z~Wn]?a+7@Ey.߇0oJQ^ ?%qtWyCI\?v<$?z~Wn]?a+7@Ey.߇0oJQ^ ?%qtWyCI\?v<$?z~Wn]?a+7@Ey.߇0oJQ^ ?%qtWyCI\?v<$?z~Wn]?a+7@Ey.߇0oJQ^ ?%qtWyCI\?v<$?z~Wn]?a+7@AGC2>kOI!#?PyXB-1.2.6/doc/html/_images/FACAutomaton.jpg0000644000175000017500000035355013152762205020006 0ustar pabpab00000000000000JFIFC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222'" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?Aloou;ޱwKQ@T(T :U|-A$)6F>ȕAx pN`jq=b"aڢN6'88`K=3SH5#p!54W΄)r8p ֹ=G!_k=z7^][ v/|IUȪvmt jmCI|[4v\m3}[8: hV6swj&7K7oW'$́ɧ-xRho"C#zC tgZG[xR^M2nU(zӚ|sh0iNuZ],f ^}iwZZ;$i}3@u*Hn?Zoq0gVZ3XqpzKr+(r0`1Bk"gD :Eǘh 0,G$dd[Dߩֹ=LO h$k###ペ5mg4MxmTo1Tc !#+S9 msT%ޢ3"{Ϸ|VQ mW \/~c^ O|DYCr"*Mz5c5 *^IM8~Iykk^%n^13"0%ʀ0rN+k/~Lֵ^#Ӭ$#lzz8XIH/~? \ \/~(/~? \ \/~(/~? \ \/~(/~? \ \/~(/~? \ \/~(/~? \ \/~(/~? \ \/~(/~? \ \/~(/~? \ \/~(/~? \ \/~(/~? \ \/~(/~? \ \/~(/~? \ \/~(/~? \ \/~(/~? \ \/~(/~? \ \/~(/~? \ \/~(/~? \ \/~(/~? \ \/~(/~? \ \/~(/~? \ \/~(/~? \ZBxsƭi:o}vwLxiH<9V$:DtP =>l4*{Q;$S'oɳ0+c0º]sl?ȴ}s7"AEsl?ȴ}s7"AEsl?ȴ}s7"AEsl?ȴ}s7"AEsl?ȴtOV ZG ̉/^N6tPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPmCۿGE@sa]KKfº]QEQEQEQEQEQEQEQEQEsw׊n.Mgi^e*v=MI?wC4E=gV6 &?;oJ&?;oJ&?;oJ&?;oJ&LtX/ *`K(`wb]Es!+']PAEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPmCۿGE@sa]KKfº]QEQEQTk) 6kk{q4! oX`>i]h&o jLmSS6tyF?u \GӼX.c5w<,7hŁ$sѽ=.wK@$Tn8 OY?}Mtۍk| Irz&Z\:)uQ!0WzP<ԻҵSkj%{{W`TC ~Sa:Q~_ ꨯ?m/ıx)-SQ].ȏ}NcZymmU9kʯ#;$QӨ*_C[v[[(qm Ӛtssʒ"I#`yŮ}cu[jqLߖ8͚6 vA9cz_D:ZEzj!a֙n}vɞu5o:\ 5M=6 cZ 9ⰴQ⽚{MйI^H2*/@VIGP3mzk@c v^ƠKI".hq:*Xm?x f-V/"c+g9c`d}ӜdXhkV=OMkhD  vc@,? ѷu \!xeI3.`F$0 EpR58 d4ϱ#t2ӟJ4m2=FӢboB}^((((?d++<'aY?: ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (<ow:($](< ; _[5t7@w?Կj((((ǚռwM 9#/]H AOMtE{ƪov)kz/I}oWjMtE{ƫV\ekϾ+5G&O"UEekϾ+5G&O"UEekϾ+5G&O"UEekϾ+5G&O"UEy.]#MfFxItͰGǢkϾ+5ZQW&O"T?V=S/m#xk#Tm kwj6hgm kwj}x_#Ui/hÐ ͬ[Cy:C$ш„fۼ \y'-A9ǛL@ؚmmj.eXd.Cpd板O].v׾&4І\mCyqkkB;IU8tq压2gzw9{u6sd5 VzPd*b 2w#c;XdtZG4yR$,($=I"bQShm^V7]L;Ű3'?'YxA$֮$o 4f@N˳`?M5HGp.eO@q @lb@>5p0hWX{nԈ2ކIhIv  m9$ =^=nK7{ gkA L+6pBx;z+Ѵ[xN{,+..w `bqgWo@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@InQ|mCۿGEt u/-  ; _[5tQEQEQEIkO7`_\(((((뚦[Xwk1^{քg!9ހ: +ZDRSs*HE!χCۯمA":[JbDe.1|`;0Кi)]}TGsG+2C <,;wk;fm9bhŴi&Y\LCfc4_H|nLFڌ]Y ZՐ{FwѲXx"\4֜i!4N4Hiie]B=F{9s!Fd8a,4s6}%EbHRm`l XDi 8+k&PLܨKU[Όf.~^ p{֍-eon#Dx Es`0ySMt&hmGt} MV\ iy8A$ZW8] Ul[)k KufepƾZ~(I4m7Ym"lTJ_*T tSwW2maj?l0 tI$: 䊟Oo45ַe㍒8x[5? Bf"HuO5eoF$դK q䨙Q>;s9ZzEWD. c H=!?L?$Q Bf" (T3\_G$: (SsYE&k+9HuO5eCЙ/H!?L?$Q Bf" (T3\_G$: (SsYE&k+9HuO5eCЙ/H!?L?$Q Bf" (T3\_G$: (SsYE&k+9HuO5eCЙ/H!?L?$Q Bf" (T3\_G$: (SsYE&k+9HuO5eCЙ/H!?L?$Q Bf" (T3\_G$: (SsYE&k+9HuO5eCЙ/H!?L?$Q Bf" (T3\_G$: (SsYE&k+9HuO5eCЙ/H!?L?$UZޫX]gqy1 夀VEZ{C,Ek@Q@Q@Q@Q@InQ|mCۿGEt u/-  ; _[5tQEQEQEIku[TFf`@,q4kf3Y;m/$W~ 'h'7_I;n~Wz,mBkii,"[B-̮8d$cj lV日Aq#,2ܷA!b OG-މ&,ދ&piaşQ/$M?5_I3pMbOkEDM6+֋&miSk h)i_ѿS/$ҰF!Wto4_ѿS/$ҰͣM5m|SA2E7)Ώ"?ßo%A?/ac|VtW1ߛ/GV[6_G:VtW1ߛ/GV[6_G:VtW1ߛ/GV[6_G:VtW1ߛ/GV[6_G:VtW1ߛ/GV[6_G:VtW/ߛ/G:6C~lthWW[6_Iߛ/G+:+qֿ͗#ek8_VuW#ߋ/G3XZ_Gr3ggY=!ӵ5eC?ZY_Hl55e{Xěk cY=!p?ŗ#b'@կ->M|jtƶvy{62\)b1pX1~.終9-Ms4GINFN9#N{:.lSi˘svgt1ҭ%oܨ >Pc=uNGeyih3+ZF 2dr#=+%QS".I@A$-Wiv/4*9 "dM-$f͒3#HI#)>=+iS1LL,hu;)1c};sZmmxcѫݝMӴ:8@HT9 *q kH*S3QkriӤu?g!"G);x8en.NT4+7,qG .U0g|WJk/(>WlGǞqFMsmivK `v$09|f\eM-bCeq$hguCpcU,qGC;.VU4}NH̄A`5"2F xD}6-n@Sہ0dj :X6Ev}\d8SmEA+h$J!Te֍%6ٶiO,"f q?P)YJ_yg,ZH@t HԗUѠ4%exM7)=斿JTJVzZ$ -YX7_;kq;uœֹYBְ\Obm" qՁj_ͪ߻_3G FZoPg8 !icWi >aՇp3Yx{]ItɆfiPybb:dfN*-/n *wʐ嶶Ȍ 99>.eqr9$0&A2@{RJ.!s{gX嶕uحKaxA\gj[B9QG3Hi )4ietWF 29Pi V#~^ ZHe f GhFxnN);\zLKj9SPSNYsw I3ǴX)1V͵?ޡ}qJ\^!Ay! ɾ |ʶKkFo_JM çDc#v@X 6P^/&}kuqs,ڸe_b}Aku?iZXǧr|x}oHぴ@ni|8R_^2k}.%_2øe~$O7z1Wr[q2B)?pGemoj)os OdѷPvӥ]#@[M@\ dh; SmlQ$JwN6̂@6FXWڪгiK x?b9gh>Nw9/ͤk,U7i,fI';Fshi_~vvfiƚj4M8M!4N4@ 4N4Hg=m%&uz5yͷ5Kpgc+Z+Wئmݏ+fqTu4)%o7^7 (( Tmolui>"Rho~qmp]pNc|>yC 1;"$.r 0pk5G=m$3st7C/a9#sJ5J"/>+{'vb1\m#fՄLsG:a8SU[kq n?茨pC Y *SgE ](K~|n2!`W'e.u_;ua$UI 5h]yA)o| ΀+H-Y#&d-.ϻxZ6ry- I,l#c>~8$m|QgqhR6p\/ dc$%$)Ֆ?0RcWDYd50ʂe`#O0`y'uc48JF%4l1]ɳn͎OmSs<]]3 C.r$gpAPE&Uxg0Nk"+`팶dg>{j?$(rrْLNemѩFqʑ郜`Vbi< m& ˃jɒIC3i"UeL ] v8'k`|87:w_&_}51{fny95_s"gqխ4a{m#I `"lӱi1¤dBMo `pK4;ndǶ8VOokKt2<0dyc~pIHcIo# xQuMLQ#M7Qk)u@b(#;i~`ﱑojDTj6#:Es|du`;R{`Km`V]%73so;Sq^Ӓ3>PeBZDbU6Id2:9ySw>g;Mۖ%2&, ooF=Y89Vx.MxQce ?Q]ԑ[ƁNXN}3hHN֍[ Jcu;*ʳ30($;xuSKƬ>ؚg)Y`71 qj&x̀a~*Yy2LE 9=bR2Rkͼnl/07_o?աaKfAm^0sB"s޺HjyGE֓ZFgjݼ+7G=p ->o?\UM4۾RM7In+,?m\ h ;'VUCʐ zm!kVo$=jbēG܌`[OH5?eAП/H'_H YdT/,%y\H"xJygϑ|٤8}T&{9+AП/H OoYE:\LU#P\y9B|)e7#zZnmm <_vxI0It7JkH5?eAП/HfN\muvĹ`bCFA](H5?e :8iYX4jQe`_ʑ郜`N4u P6}UvPECTL i/5g[ixue[J{yK[DBƻcBp { bi6VY K+sksHm.MJ( rWcnO{iֲ̅YZ4g7%P8 BdF^@ X,A]^hdxfGF!$GCXRlVx,z?>|[fmJ34Ƶme;%qTy:`bž \Q]o€@W==j0!R+x`-Ym3 ;}|ÕnRMKˋAy=ŭRYH3Ȼ\gЯgU_mj>ԭ .'D{q)`Gq{ԶXHbmߚ|G.4[Ņԫ$s#ލOd浫js% 9&6%6B䐻F4K%sRvVWkYyɺ'dH t"(cނ&r|sr#uĞUyõ yq8QzWv78wmYet4;/1J?).eXeY\, <05@N+мSke\<`+|&u$wNbu;ū$ve۹~cr??$)ӗ5r]}B e!ſ!w|on+;MVNgyS$r3 $#]9'$קo-OGIw#7T 3n>rxQTygtaڻs(,Ir`~eqFt7.:>Yݲ #\@[TҤkkrBBFP2>,76ilmve"#cauƺ]jlHw=al&U~V[p\ca2GN2rsAIk5;ʕgY<ًh_ ci.V&2LxkoHgkJeW!S$=(I?){H+fI(m|f(@nCfAǣT$%$+Q8 F%eRK$Z q'ŗ6=̉o<%"kfBY |sy N=BvCM=^ir[ZK E^L!6Q+Jb4jMYG$thț19 œN;I%#)!AcIRHSNI&M$R@y).<%,l ;Yceh෍^V!@ۿ:V "M1݀ ;N<CN4LʎMnY<;xft?ϓmqq}sTƐ3n+ 4N4@s 7Wa oWIn+XӴ= R ;es$goA}5K1xE5]F ȇOZQEQEQEQEfk!7`o5[-IU wKM M SBVF*2G\Kk kH3}BkxZ1[MB hS#rku#<[ȑ,¹PTBj3eK;ĎONgv(N0`dރ= Akhg]GP](Gner`` 8%e-4Ӊx@Z6@d:J )k̶ҰJUP6@FO$cK思..VyЀF:sT}O-pmV+e@"vd}0AR+ޤ&i`,19Y;bW#\=sk_ -P^{MGO+`6Y nU)@^G5yuO{9H9;8^:xk~ ]I:Q8yJxWo#"yK+`PxbHzK}?Ai`YYb1Co$+DR8Jΰ񞝩vBZ$Ae0HA`sU|$OPߴ'_cg^huS '5 rVѷI,I [$g(J2$Or#g e:jԦd *[_W[Eo%pX*`P>fS_0#ے8'Lc}STծ6C,#pI,g8,~u bQ7P=&"D.͸Mg+h[_qkoCO‘kCoS2',p3 Tg#SBqBgi^{tKym݆LR,i#&͗KXRa$|GHf(099>LSÖ^zp1\C)nh`f0{ryqOEg9mRM+ FIRy:F&ˑp.:f:t\zƟ5dM+ Ҷ7p@GNS -p2[γ#Y2pP3:ѦƒM1&fImQ#-h|>kA=ClrۇUfV;te#8=21UuƗyohķѐ&^U]211*dFu-ݯg%Y| ʙ':.)³ߑ|3 }|E1X\m9)l##_K6CGۉ1k|QiQMb2GrȍR$VxI2 Vcr]EXXlNMd}.<,sRƳ.u\%0q|k'P][S*Xm\78 '@qI5m:sәO.m>Lbߐp>7x+O'3<)$f) (IFrO'=jKGuK[&LBmL}ߕe\k:ս p U`' `g46\UGѴQ 6aZ8%X k62GO|V3k~eƚ(.&3@(h9~>Lnݷ mޙy|qSiﲱ[I+s^^sm%&uz5uG4 =!V?"sşHj: ( ( ( (<ow:($](< ; _[5t7@w?Կj(YZvzJ.ER@P0@ֹ=G!_k=Q\!_k=ֹ=@|$ K[x: }m}HFn#y5YQ|*-qko~-&hޤu8aAJ_ _F~-&潥6mnbNbrrI'$I$I5=`ſ?q/#QDĿL/sz_ _F~-&ޢ~h8_ _FoQX?ko4OK}ſ?q/#Q`6MFnJP'$1'%j>h8\[xK\K"d8fk'%jCwh8\Թi՛q". t$Q%47c6ד@ N>S~-&y~,&ySْ3a? MiXX]ͼr J ĄN: EM7~,.yM6ggHWRlF}6z=Xef+M2r3nW@]54/ j,%&64)_toKuh6XW6!Cuh6 ׊ _Fa4X?ѿm/#~h5\wtAxu u^/|P.eHBH?Wϩt^il1i4:|a_z@g#-b}&dUdqB;E/{#Bv$nc870#y:>tx/r]$?,у|-,l-Rkx(P"(SVaAUct?MUQ@aAUct?MUQ@aAUct?MUQ@aAUct?MUQ@aAUct?MUQ@aAUct?MUQ@aAUct?MUQ@aAUct?MUQ@aAUct?MUT7S[9 F@Mƕݑ4^*>$g}"UU+u֟6KMfW}Ow^Kۙm_4 YB 6J?7_.uk4{ \\hڻNک73Xu{v ZzH'؎~m;`tA]bI:Np}bh\j4VJh0h͙<|U'$B7͹ `.UbG+Nd'nLizƱi  ?t8^:G!e3GĨFMKWrsƢiqÆY|wfzw=Noo0>vNhBP°fF<| TyKP]kyv%)\HX΄|0ۮC P0fs9}\rZ 5|ȷ,nT Fc$Қqݓ%7tX}Qn'$*1Z@ dgm5ѽxK݌ 1'.:7ݙFm(m, 2'MI/LRFV-ܨAU `WIǨڝekZ:Ob T0#<3PM69#-_*B(!j8<15|V'̒[OnK;'y;sRM2tJ&$D!>QX+c Ӽn TomY-ePӜ1HW냐;5E4!xډ q`;[$#WCB~M6iOZq4M8M ii4@4M8M!?ßo%A? 7Wa oWM/{(Ѐ((((((((e X`@:o")#h &F`P31!d. 5K R-cry'<p8@Ɖ!R?"mt=S*mEu( mJq;c 3V!gk<㵌4[V!gk<ַ;R3z?LovCy{hz?LovCy{hz?LovCy{hz?LovCy{hz?LovCy{ht?LovCLov7 4?:/?4GMkwv7M2tֿwyi M5?:?4KMkwvmiODuyiuyihѦ>ӿY zFkSNc7v|)α;F 5Fo|IA%>/&ǧ8S|([s?+ZA\9 VDQ@Q@Q@Q@InQ|mCۿGEt u/-  ; _[5tW?WR٫PAEPEP$e%Cptm,FA{^}[:4W6sG-ҢdB,>*RK+yv&l y. {w Z'E7r]z^["m?$1pY lVc)K<2̨b9#n!-c랝;tn.-㿵ygfRV5*o|R{!x]8fpքOŐ_j-jDI$QZH! JwG4Mݝ0ZۤsJiX Iަ) 2w9WYi[4~(h±RN [_SYmj8kĔʪ֫j o;oI#ڇ -/ #hܘgˮ允ڼr3f s34rb+Ž0TskD$R$TlC r8VwQs``c:Pޛ+[ 1#y8@HCo8WynC}57%Xn2#^ZB=_KXn 3hvb'aCZ4"$hƪUPj[qVVii4yRiƚiM4M44M8M4M8M!56Rn?G\ףW\>a-¹sşHkgc+ZN((((?$](>6!J#:º]s u/- +o+lW?WR٨((𭅦ַ\@]RT3.ksL,`ca.X.eO NUDPK1΍}6ZIk$Qʜ'>طkKZ5=j.HOLiy+[y:sr/2q99XOtT7 'ke,Qq]}G4DꌙįnA"y|34akO|@Q4';d*pA^9H|-*CmI搭gt$*v18;I&#P-5C&B(qR)/9丸܃{,5q^yzS\!>MBIYA-o(F2IJc9ǵ&XG'4e&]9-=$ĎMp2g/ IaC9aԾݥrI~4"GGĻ.7sY뻙/-nyR퍷*8dcSv$eƑqiӍ6OZq4M8M ii4@4M8M!?ßo%A?:]$iURlh=n 鬼5o&%Q>^3Rk;Q|Cj:X Mgc2~߭S|s=Z;\+}\<GQz40r*s֟{'(|s=d rrk{ϴ/1j"t_'Cgbs=A QmU@C;FH5HO?$ShekH(4sDĆ#99;O͞׻tk^U )&1쒲*O?:2q>o羗y"7?K<E{7 GJJf}9lJb;/0mIUY'(|}/Eo羗y",ŭ+²鷉y5%i!$`4;tR e~&bȹk;##ж? |}/Eo羗y"R{*1(?O?$U(oɭ]i],=3ɛ#Hctt&kea¶tk&K#ERc ;_TC/ H]C+zɓú ,죉- 'Id oW4KK't068r+_"6PT-/vcYr2@.$˦M{(X)6q)Fgw52&i-S;́p1M|.ප 7p wg=ۭO)kῶ=:ky#FG!9%#l-ttLҘKw%9ikHRK(BAե'n_ι-5!I.܋˱?@ZDj WauN+xi#\4C6й~U^FseYwF2ryzdZQ[yW^Di7?:ڜaY6U֪/KH&eg,]AQ#m $˥2E孤QlF9Fܽ1ЊH!ybGh|e2= fmo S#1aYYJ䏺J@\ƛ$6n6GܮVy ,%^n%_֧K-GiOr&yn2s_zpOq2g1c][]Fi^Hm,F23erĜ{g1] 9i#0ii4iM4֜i!4N4HiicM!4 4N4Hg9In+urO+GxsM:'K1( ((w$Ŀ M]s;y_]覮 ( ( ( ( ( ( ( ( ( ( ( ( ( ? ѷuW?g%YUյ?] .rxt7J#9:d}njox46Y$E)򏕏]/<uW1"vqC=Ӫ\4%A FA9 cHɧAh+}-H=e_)ԴdYhmwh7c9kA]M{q+Zi,8AZP\fD^ГoZHItYZȶg>TPKxWïme||w||~jk G,J[<#y5EPCgKm+ۡx@*safSacÜeilIckry[|3H]FK9,H[Y#<2X)\`z{֍n846-X`H$8UUQY@t5mT*PԴPEPEP\9 VW?x±tQEQEQEQEy$:DtQInQx7@w?Կj+o+lP\sa]KKfº@Q@Q@Q@Q@Q@=gV6 ? ѷuPEPEPQW0II,2I#C+ v( 9إƋKh`5`0R08ϥYM6(q[$d(ڱ(SbIժ(XV6gͺ'*_H\M]FK9,H[Y#<2X)\`z{֍2wDaE(6пb3)rqjy4mJ-J]&Gte@:a񑏭`xK/gzgۅ51asۖFu6ZHMvd3m~?:ۧ7)&n/4ǞZ92)ᕛ`q [mnEŽqH Ke0%$dѴ=3al_ˌq +B@9 [j^Ko6$In+o+lPEPEPEPEPEPEP?'%Uj+*E5tQEQEQEQEQEQEQEW=+N /(/m)l5 [D|_MKm5EasC Э/&A%Bޢ?V?_G [D|_MoQE_+h/ Э/&`/O?V?_[Qp0 ' i? ' k~p9 Я/&|?_@i> /EO|'BƋ5iX> /EO)Bƍ5i`W"i~gF5w:Ưk h#vlbY]n<|۔9 I="ǃkú;wNmyOZ|~$$+`NN+}szY-~y,}̖iVbF%4BO,T}U5-F\ƲʓU>v ۵p8}7u +e'f)g$xq6 0koy~"HhP.p@+Lu;t8ΰ)$IyJ)nD;(3 ( =!V?"sşHh((((6!J#Huw҈WA\sa]KKf  ; _[5t7@w?Կj(((((? ѷuW?g%YU ( ( ( ( ( ( (9º]s u/- ((((((w$Ŀ M]s;y_]覮 ( ( ( ( ( ( ( /(/mt_P4_Jl5EV&EPEP=׊t{-DOt2FHDU Q`1+b}+]ҵk, w$2IC#w3jީr5($ ;L1h§ߠjWUu}BKMQą'TUjZ/4Ks5!Ah`ّ̋M7ϴA! %D.?pQe]@:Xw4}ZZܻx$&U8- TRFu<$YLTňP)vU|K'g 2HBˆ cGkoR.FR[AП/H OoYEZ>#4 _u&wJԬ$ ? O$UmٮeY#$.U dO'G &%vۘ&̑Ȓ 0(W#tWfC B~"H5?evr=Oh^'SyW &TVd.ʊJ6͜ x==FKc' OoYEj'*xLYΔXvX #=SAYX{H"bvܿJ.t(AП/H OoYEiYjv,ItE: ,yG% |(r゠.dj')? O$U]$5kEGEBb|wM'$g9<'sy۱V91G2g>̪uOoYE4 䊖Zm DG $` @<4x+p|$cqH;_,/wQ$`..ŝAjae<'Fp TCŷX KU%^9+-bnb xN%*b `r6UgO]^KvƪU[;7` !sꚹ t+N%Rw`$SSۗ;J ilE὚&ISUS9`B^8469*ğ g'&d; ŕe t_9sK,MWxUBsZWJU5WéIZ2F+3?Y0pn7q2 ẅ; 1޵8 :' "6/FoQ^j> 5$su#܊7)z+RoL|4 Y6VѤ*Jn@:|cw4+{=V9H3D8 ȃ\\Ek3mMʹ<Ey~wn$o%FNO*OilX$#԰GnkUA,[<s9ȣ^t1"KjJFBV_Sm[F 3Qa }p:e|I[x`HT/fc 8(']APKIQCo +FL?$ +ƾ0նɨŁ=O#r:+yl`Onu$Giڔ@$%Cr@#\M로#nzmEVyP͌O_rk;}2kjFDn o@’*8flY}6=qwgޞh7&75TY@{' p88pCQɵ[w$F3GZ[ %1ǬB F5 #6D@$ǁ.Pow;wޞ͕}B%C\F=FtC*AIu+z3ڭ i}vV +y$+3園qۘ-uxJn6G!$'g<1mw:Oq3\{5 &xf#< ;~GfV؆܀G={Reovvv0D ۉI~āS໨$FʥnX {+c{TTt1@FGO;t-{ RNSv=bIbVݟHA*0 LJI1(HP^{ekDk ۭwB[G4Nbi#TFĹǯ5kWmOOn%00~7ǿK2em:sX>~\^?xt"Rnr;p8*_EsJ%ݹ޵P (2 ( =!V?"sşHh((((6!J#Huw҈WA\sa]KKf  ; _[5t7@w?Կj(((((? ѷuW?g%YU ( ( ( ( ( ( (9º]s u/- ((((((w$Ŀ M]s;y_]覮 ( ( ( ( ( ( ( dѬԩ\O1C(nzO}+{YX+3")*I7$nn8/tuƗg?v;A?o7g='Qݟ\ƕx}B}dfڶK mMl c^m"jrly4-V&;е:F ?C+o\7Wjd_.V6X$F5u5Ku;0r{9U:dnE}.luI7g='W)kcbxn^ټdɁAyr뺁U֒NK1wc9#I7g='W#}s]Cao{&2Z nkL@tj1jmvRb޾Y Z+#vI²@d0yy<9Q:v!zkm9&K)-FU{}܏Q}/_ۉk_ֻehz741 2HxDuf ~54%/ZYʤndP2;:?W]3ϭkB>2bF߽xh0L5&e}ğXSVvwW:F ?C*@.4X[In3! p.:F GfcK[" q5 n壷Xƻ@ʝO1Z_[#vI= -nVKKrmCMj?#vIEc7g='Qݟ[P?#vY`Xߘc#گ@Q@Q@s?+ZA\9 VQEQEQEQEG$:DtPAWR٫WA@s u/-  ; _[5tQET&x~љB`@'=:YxBKfYn$mfr +0CUcnў?|k~/6}[e*G Ee]+;k55-nwIHlҒ/i-7BUYS(3' 'F' Hբĺ 71zkj.%[ǀ ~ 4Zr6 oͻlKx@ VPXۺ+*F֦Ai_%-ޡ =2= QEQEQEQEQEQEQ\|O<%˴)P_ϯ4x7@w?Կj+xmEw %HٕjJ((((((w$Ŀ M]s;y_]覮 ( ( ( ( ( ( ( ( ( ( ( ( ( (  ; _[5t7@w?Կj(((((((+6!J#:º]s u/- +o+lW?WR٨ֵFX4:kyoE\ $Gax;@֛W}._lu݌`i| wwi$WZDY-d,L?oOȴixZ'eZ6}g+[ex}[vd|gԕMYtۋF9l[[J H`:F{Oh9hoOȴ9^f~KV6 \[E#@Eb%mT?P۔JWOK6t"4g݆C8!^-/ D̿I8a{ZJ o7مvEqHsdm/5vËsKLx ч}EAh9hoOȴrg]UfSt?Oڧ&3^$KpA`WXxcĶ?/Tfi"ZZ]?;u9n޵ixZ'eZ\vgIEs^-/ D̿G2 3/ D̿G_EQ\_EKſ?s/"̂(kOſ?s/"9hAftW39hgt_ȴs gMEs,EĿG2Vt_.}x&G0i6һ_EĿP^P-mupǷ=Õ8/Z|֒<1sq*Av kS_{^[hMTSg=2yIkѿq/#QΪU@ 5'犿_F=ή?|U@ 5'_F=Õeo7%j? O4KsǸrH|S@ 5hxs3k A}kmgygus7F`ʎ@CLc I&ޢ*QEs;y_]覮!կ> (hvimF9ĊWmM&#Km.S4k(Iac^]8+JmsilLmOA+s (ì]:yo%$dJ{T\6_]=ߛ/GS=s=tP?C~lGOeQ@#ڧzz??s?͗#AEsj9{T\6_]=ߛ/GS=s=tP?C~lGOeQ@#ڧzz??s?͗#AEsj9{T\6_]=ߛ/GS=s=tP?C~lGOeQ@#ڧzz??s?͗#AEsj9=)t^Q++K8U{`<=뤮~J`w@Q@Q@s u/-  ; _[5tQEQEQEQEQEQEQE{C,Ek]s?+ZAEPEPEPEPmCۿGE@sa]KKfº]7@w?Կj+o+lW7@m+oR.FTa͊(4 ( ( ( ( ( ( G;^y^ͧh&3YA!@AaꕚUOYfVH 1Burv Fsksys%R$)8*"de bh-G0v?Cy{h?Lovۋ˭[k[/#FɞԎU:*O9.%L;3<>õ?[3~^]j i ')ݽ_nHڙ?[>?[7:r%-myQcUCR1 0Ajn$'Pm`D#baw{_D4y{i?ZUDTE P:Y>!OX̑$Tv! q(nQ3+#ε;H|#ε;\ψZ[Ie͝ لRB$D#jxD"VK3<"+$##)J泠lE?:?'"Zo_;㵴9R$$m@'$)e %~e*x8߭fV0Z%γ;[h ?iӿYHi] ?:?!?:?nCJ,M;~u^OE4?swktMada)α;Px*;kV4̉ y_HO,WFk;kGiIb&=( ((((((((((m6$Xrp/4c~o!mU208A/۶<hX޲u?OujQ׋r!@VX~r B#H;wRPeeR21둊&{4on\ҋFck2Aing66")',\,xeCIn8H}&,mMnHL;2mGotD-nmTE"0`O̭0P21G[Ifڝ6٭ 3?"iZʼnoVUFhNjsuIALf>Vq+J|oa!xnrLP?)'jY}sU,? ѷu~X|qf4[;$"O9O(u[m=WLyc5͏xJ ZS|VP^Gg}qo$R\3ĉ,2 b9ֺPAoVC |}؎4~G;5+%|q뻜Im_M'[֚8[Yib1;U.y+820NS%qo\.ݸو13kx|!+f]LB<*}}+㙵|;4-#ۻ_sfUū_//_ :2ѕU<}W/Z|֒<1sq*Av h((((((jy^kXY|{ׂs Uեkb/EzWM]kCa#-ܼK-9e?E|M6Ҭ4XUNPG(( ( ( (<ow:($](< ; _[5t7@w?Կj(WA\sa]KKfKJ`i]%sz w6Ҧ[ ni!t-~.3k,sH:~;g=+R[jm._TT$܅i8i9x%ίY֣iaeTq+'UЦPI$nѵyRGF́ؼ0]n汞 ٻ2LC; :b+&~ohEڛgk:yq͜>Uմ緂MB&P҃Ш[˟{eyo e־j."19#Ң_ k7 i%W˹FQlv+m۱PyWUY*qR}hSxe?4Y!<MǙ#>? *>n#k%]ʅv:C?fDucvqXW^Wk%K}ŒA1@vn3neT|L#7A3hT`G4kbY߹%awdom\xVA08⢏\f)b,9uBA'^jgm#M KHOqPEɤױ9.ȷ1)=@99 Nl,b۝HV38 [k[yFa!ȩ+Ӝ1-džme5pرr˩sv+Mla%y{*Mn@HBٳw_יJٺkvsVw-3.PfxS֬;fg*8I .+5<>` sLe $T&M4\G+ydl)[fPs,\kGjuFnnt}ɹɮܓ:Ff|O8qUsj+XW.|6rype7)һ/˥x+[˧kfx|͸b1cԚf{9/,4m,]9KXppp9=GC-p_-`DϷnF&l4{(4ӣ_5\ 84nW^Mݍ-ഷK{hc8*p*jZ],sLVİ|f"pIsv^t3wLkgkanv(Fy8Piƚii4HiM!ii1 cJ/3^"l˽V:[[|/ xőEs-ʅ ۑҖT %XA pG\{}%\ÄElԶv(ǩ\袊QEQEQEQEQEQEQEQEQE[xZ%}VDvxJ-/]WQɪdr_/ D̿G_E+>v_*1[@-2-rv- .aVlON[z%sF?_EKſ?s/"sF?_EKſ?s/"sF&,n,;oqE*f\2kw>ӯ-[ J`<$ץG;TcixZ'eZ?[@-2-lQG;TcixZ'eZO? D̿[49rSſ?s/"j:'eZ4G;Tdkx:/eZOoEĿZ9Q8_t_Kզii!#7kq/#Rm:7%j4KH9h8W4oK|r:;*I>DS:H4bF%j|[:h<|A$_NEixP:tlᶞ$dY_Ք*.`png=[70$rCi!"(ȋy$ l0y'Q _Fgv`mdI"]{+?l7$w;FrK7*_U.H/X>.N~QX=z)6t%@񺺞 ӫ?D</օnfQEQEy$:DtQInQx7@w?Կj+o+lP\sa]KKfº@sz w6ҺJ/(/mLC^.usonoP7ݷ}+f+{+\שoi%ц y6e(-pGZ}"7 #,#8<敧j텭pЫ Qɦ?rY}F&hlglҳ |Ou-ƛu0 9NZsxŲM\;ʻ.MS͌qkfHl#1C,ve/hʣ~Y;IigaknȰ¨ fp7' f{!{x ;XeaJ|_p_HV)*:J,KLk_]q]쒔Ty $*ǎ?sUlo ZM&wem&߸1/&? ی)^Ln/t4k5Ѵj$hElf1z|>yIXΐm@#cgt=aMldڋO&St&,$FP1jHӡKy$[ I n؊̸WGh6iq/{}gF>t} [읠u9@$^ nn6+#HodD+~j:w5ag,F)- xʲh7,1APvQTDE 8`y+>gbM:lXRKrQ恍OvvwwE w*\c8SvF GkiM2ڨ[w0.aCjF jSv n9l}O'֟[R:GVʳq|Ğ~CDץ֥ܖk┻JwqvN=#uY|v%r3~N}f--˭0nj+ `p=RB쁔JOGPr{{lbkKyd?2yaɷ gv{Ƴ>n"D%H~]gq98D俞!bs4pB jIt:[.$yЩh#W_5>9gq9Gh ~PH[%oSHs,Nл ¬ޟts߽jh]Jko]Y%x|b,:{ }iZu`TnTDŲ,a[U7DVFfo1R<֞˦K;Hܨ$gnxlnxcaEXV =89qvo(XE`,j.I|:5+ѧ]l 2I2G=7vKFK$LęD_?Nj$7:<2!Gc}.M{ -I|[#ۻ "AӰRj]ʏL9VKo"J&Y 5gO3bƂ%yc|.y4Lw_]1ǐȊ0p;PD^iK@2}x~מ?Z^,*,0FͤJ#\  xXGPppAZ]jvyJЯ#ѧhw5m" ,0 >#~,O>Kƒ{@>KpŸZF->Ь@kR{7*zA >iAEsi >tP? >iAEsi >tP? >iAEsi >tP? >iAEsi >tP? >iAEr$u+9-/tf{yc؀}OCs:YzE,wwl6 `ybw*y$OLb5s S6BqA^?D0jPҵXt :_y>;^/mĚ[3~}M}Cgag-0CE/rd_>u ڏ S@_XOj8Σ?k{o²,W7"ȻX+]FGcJ<6m݀skG_TObEVEQ@Q@Q@Q@8扭,VR,-aiեQ)-e9%y5u㍓OrH#flyC<?>v#&t K6 v7%U i x,id~I:~wp#jZvՉN膚kGZqq4$&xBtZm.%1Z_J[[T11$=cK2=tojͽZAorn{o/ۓ`9{TjZ(iqCii4O4H zA3o%@7 `WZdmpmD-jIڨ I<Ѧ.b4il ^- SȬxyRFԬh7qxO$JkcEN/@֌4OЍhV~ x?_ 9Š((?$](>6!J#:º]s u/- +o+lW?WR٨oR.FWI\ޥ%E][t{EԿ#+}m{񟽜lY5hZ97gww:V`|zԺzZѕXϱ8lrуG{o +Sm q̱;rd~~p2>V޷kaw4wL(F.\T@&[H[DW+o&yIeDRG {iYU4zy!Ky{xd!$ڸcw"gH"06 Zpitt1$L정 }sIaooy'!P7(O rH=[F-AiB-58#O<|?.*"'ڵ/6H<l(۞,Ec ۭBQi:6w4|}wR{]m8{z_֝cDSHgq2v0 *Zg,Vַk kr3qu=1f/:Rd bsڹ`@$Mguc5y uڻr(=(~֢_̵r7Z6HB6]FGW=}iaic[mwwP6d;θ#nkjSIbKX-eUf%P>.iEۗSvfpѹizn5KhZ]tػC~F#x'sY/!nbr3ܝt>'ĺHk;S*pﴚ?$>oϙy?cݍ91ZUd7īw6kz;;#l+̹Q=~^ J}2i~bf@RP@*OKi,f{"i(X)ӯUuE#x+\'9. 9<(I^*%sB e(aIsWKݱ@qw3*<6H=:Fu+yj6\Mمijvj#\IC q@N8^OHnœG=%.Qp !K%o$v洭u=3CSԭeiwpҨDcp'"xwtY ,v{n#56GڽQE#d9F+=?jJRk߉K äl\}ui]h k=̌ɽB~b,#iWP^QT[ņtQL 7($g-3GmWZ~g{7mq\[ i(s% L ;f+=O4M44@4SHhiƚi CX~]8+pv ? ֏EMA~i+5r$p3Hv">UNOAEt!XQ$@m ͷ#$cpt#(((((((_ź xhm @>IM>B-&") czuL 4jV\Ȯp12dn}ⶺPI|=ǖvEP3U.awڮE+Ѳ7+VBGj$I5[yiT++dc4ql&/z g\yǕn0*K {(nM %*0ۊвvQj׉/g7chN B Y<'A$o2dpyC\ua]GK&ONv$|W \>>dAB$ :vj'Q;J+3~^??[7Cy{h?Lov7Cy{h?Lov7Cy{h?Lov7Cy{h?Lov5_Ocv.39q?0#Y|;^UZu @ O3~^??[3v[HSxRI1˲ٲH1C^Gsַ֨;I~?Z/[jgzqփ cqH;_,/wQsx;z1Y׵'֌Ckr YKsF_k-om鬴$xF72,SDi5 95+YUE]6)N>8<|Kif (7UʆT2U$f뗍 Iu Y钥2`ۼ99y+=WJi:3s_?4?R&̐\۱_,0/n@sx5>4;R j>$4nbf-E(X9]4+c5 >kw$)20ЃWž4ivJn123b$-I'׹ʶO68v>dN:G+ եk8wmYet4;"#)Sn琤x`>\ T8>T"TiFUc-pr'5-bkxUkGc 5Eo$ΠӌVuū$v6e۹~cp?;*MKI\ɴ!^ %xc)P#\2wS9|C*I,:v\V[;W$9$9\`7_5FM'4"|Sxnmѥd[gF.";8 U1Z;G<8QD q1G2!SoPӮ5#uqo{\,M1d- .pQֶt.&kƹpҬYUU/AI>J2HiMq^W$JlR%d 9't&)ukޢsݔq"GC'!p8SݎN;I% #B?@'Mيkq3 1ϧ-EFFw`  ŋi,Q\Ẍܕ lҖ5Ep~ w՚im3){JӇJYk+QYDL y\(!]ԌNRxH5lec),v19Dj~tƹ3Bnt]aL|Iko0z/z+5-Cfmu.n{>i1m *Ap8mxMNM=?_E$ͺDES66JOKZ+u_M>;ߴaD(lKg_oN¸QE (((((((+IsSRF]AdTO+[_TTبh: WiSEHR]`qWYfF* ヴr~]B&FIkicW'vp6׺H/.fK[xvV#Ɍ*ݟ7Zvrݵhu#͹d.;T|E,SJu-(;сP15޳$$;Zmt ztrxٟuƪ"F2G$~VWq#7caxSٚP%یaqG[kmu^J"A'޷?Tzݜdb͗eĶv\CxFZ=j2Ao:DBgƩ= hHxRirRWHyKs{EH6 .(?).5MYEFUEhx=84e址N+\bkk{xXg#UajK5٣h#vFHAvzˎاyڦ4W; {[t̪@<.wt]mK.<1cpx>ۯNmui::E.CrT{a>^nPض1r@}5k#Qo j3MLD\ݘT qTtx YC2:8:r\T Fm_P Ewp5-~οg(#fo~PF}߈/4[1Mm#2 *NR:\~i $*"3آ^qSno4Uhbmَp^ $cW5{(v\Am#* '*?=<͘;lgn1ߦxcZxFV"0$K$#'Zu#&V웶} ݜgڋvLi|A[F]mO9wq0ҥRL 1lX(ǯ$ r˱hM8[=>5i.}2{M艍4f4 f˺A<:Oi2KR̤H|+ذkcE]??U8H;M@#ZkBp((6!J#Huw҈WA\sa]KKf  ; _[5t7@w?Կj+Կh ѶW7@m*e淙o_0VIƭ0!_ٜ߷}ckV+mMBWbc+\lY Uf *9.W7xiF$Y$@H2>N;@=J $+NT8e d88 +\גXn/-M;'sf#*)Z֪Fd?2 =8Kt8.L (9`~/tm^MṊOm#3*bWg Ao׎K2\ֿʢ;|R.l'>7~yy;U{%͌P/ԣe6L9R*PoCR3&0EEqV+ I蜴LIxsdvy-mTCpVB|pVb(?}tj>6x**/p tUMH^ dR>I/nPEKHbhmd#SN@1?XϾ7Eʺ6 E<۠y\*TĐ+[io|R$n 7Ҥ#RJ  䅲e ߼EG HR@Hbg$cWF+yv;V-_ުdF>S2-zO&`v .!Bq]z3\{7>aݽqzsn"ė\*YU'4N4@6p]<-2y.$A:cpyUnk;Ɍnv9cow,;OhCH)-ݏ?ks*{M`A! |ꀐHUbB@: 4I"%˅pTrAU+M&c,2޳ۉf'b3ZhJm]~0/LB.Ԑ8][H4_:W5+yS89SO浣ع ?JݶHr0eP iDtpm*d|[bxZĨfEцI :Jc]&'~C?U?0U${|UF㌓}iw?Q ߃kc]w?Q ߃kc]w?Q ߃kc]w?Q ߃kc]w?Q ߃kc]w?Q ߃kc]w?Q ߃kc]w?Q ߃kc]w?Q ߃kc]K&;dg8Q f$kk_V[GmEt7vv\[0JԴ0 D=N^?x);QXQ^FO=d~[?ScRiwcwjrHw1 u<-.D$pA}2슫b,7w{VE! jUBāYCSItśˍT|tUA$l8`Af:έkG`ޘV6|gh'\sQkS{9UcmIӸ2N1^xw"1S-B'V90 8LSKu"o4`Ihݔ\0֩"XAQa[-Ny(J˧ѸםdtYǞ۳}]JKT$xaMDB{dDk]Kr#/ɰt#!Εh." >"_29&Dmh H'FL#VvSHlnM ]Á)FQ|d۷&M|ml♤x]WSAciZ5Aqڷ.tt$3g=[\mԃav5E<tDYw Y/󤷼-V,qs֙7٬͍3"*HqM6nnT)qWt=z]n]f[ x.ҝd.ݽ<ӏG~+g@K/` [׸Դc) RW!%,bbqozM7^m3ȅwbm#8D϶i>%snd?2ybAmwg1Jj[4i2 g"EuH ztuI`[n"E%/ d`c9+@)xh }9~<#LT@($v-d 7_߃èm唓sp$b2pFkbJKmi+axnX Pk*[š?s,NCP 7M5,MLNHudffx*3&ֿ8jϡocm4Vr`?u$8dc° -Qyqۅڱ`q:Iem$JT`dNit^_P &qNOa2{Sjf=b?᫹4SDΖ,:r7=Nio<-u| jHhK r6cjJ8^*R5\y8%dV$R"ۚz2m[}Udܲ+38 PG6OCfEsV w݃7Frwl5 :Eҵ'H-ԑffiq:sM4[s_з_=Y]YhpOn1qIX`DyRiWQ'uA k$q iJN˕S+N7.͸gZ ~9Ǧ})ՊSi5½jYs2*C4&<3|1zt>هM8__YY$f`Yzo ի6eq-\(@~RJ$<AUO$ރ#?xVn/'VO#Ѽ4ō lAj ,Igc [xq۪as:lCP{?̷ߦneq17=O$t;i1n $iE4mN쥉 O{ZAwʺ42F>@J~m<-k MHx.% }d1I95:E/{_B֙=UH$bE(Oww4+2}2'ҮyiPSb YogYn7<C]~y䣺eM4Jb -1cN)M4@4SHhiƚi CX~]8+pv ? ֏EMA+m)t꺕ukvhyVI#'  c8n]=,ej!Z k6|o\r9#CZQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@rEu,5͠^@j@KR7#p#Cs A5:N{{02Abp6Zgb5i'db/U~isi4Jyjc{ qY2:rZ 0q*raӎzV53_ -zL}Cms:4q=ԢD18 `a΅{s?NKs_fǐa{f  gq|10r3>UIr-ɇ&|x|,~c[үaҼ' É, }n&-Cߟ=i-Ud+~&Vj6iw(%cC>Nj3Fw!#%N8$~5nakuIKb+du9C #Z yCj%*34\}4z_nz4iyca$O1h*HR9b7ߩ'hb9XB)1iڕ.ڛginH1J9gcݼqL֠b vV5+2grAv;ŀ`JCkЯuծ7Rwt4 Ka1փP!5[6$2L(3סd?a *,$a<ׯX>1 ҨFrٝ x?_ ? B5]8QEQEG$:DtPAWR٫WA@s u/-  ; _[5tRKƇ=wN ֒6|CƬ@1Wa\ޥ%E]-!L]owjL4G{ƫdD.ط p~ -bh`aϮ;5G&g#UuX(8dE99pO8k[quN G%EL4G{ƨL]owjk_SYm|n4K,3G_ZH"WH[knpqr2PL]owjL4G{ƪLjtx+Fk8̓Ɠ)tFr9NmwL'eQ4|qeܥ >iV:TrpVAOBX9r&g#TaϮ;5[R|aϮ;5H|_Ϯ;5]/?[Mmkj(f%ok_$Tok_$Ui`]϶K5I n> /?oJZ Mmkj n> o?oi@0-Y-Y϶[5[Ɛf f> o?!f> o?nCK@>+ӿY-NmcjM4ѠjaW϶k5U| Dž.ToI "AT='5buNZR1*+2x+B#S7+'EJ4r/t/-aC}5d]V:U.ീpd@LmN%4{l2}0+ }>PҼK"eA8?>iW[s o$D$6IS!|p6kH/- G۹B(3`"| =&+I te# +a;ߵ{2L<>¿L}"i@e o,7u%39݀M/2΅8>xA @B9Y$816('HG##9A2 X]|]9'̍WR9j;6 휗t̾`e*\0zI_x]Y0KԍrhFaw\VRTӴcV 0QeUpwuk"$kc`L>w ~E;Zvk4;$GpB˧PF\Fj /n.fc5&y$`rIUYxb{t[D. YYDLGB*? "ºMQ?Z~jn4gEbȬT z+@$VZ!v d'UёU5vŚ9nYl/(9ve׏~jV6A#6VKysvO1Y|.Qu5Uv[rP<6F9pǁ9ͨ?i 6b KOԒs(ժ]/|zo~0|ٓdrӓ3jiCem$;1K3ONpsF;?PMuyt:B<@ۂNahdg1ztڠ*=/ &2!8wa+2<9@)'`qk)h1u tÖp29(F2ä.ν9:V^Bv싥\3˰[y2 ߢm1kVԵ/ kNYEUE<;;azo~0|ٓdrӓ3jI>2MF3+=d19\c {rsGPMuyt:B<@ۂNa{nm -r-6YRP>QUIaygBqaV HJ.'ʲxF1xrg 8lYGXAgP*SWg5O8G.g%ƆBT6܁}3QxIY'<`6> &m-'yKYL~Q)PE<%| Ƹy b \ f*{Z#d+)q~eU,֖rG4%ٷvI c/?Tc,mUn!YP8PX)btO,+F1-Ek&~\H7#AUmA`. Fo4=: Dժe̲G$m `08xrfDկ>гdo/ǖ6c{֖J_qlM2‹; (n &qDUQ5$7&Im6#-נA?nyª <JdsFIU5fhV !!  rikTtՖR]DY dn69aLUXi7Tc]\GE0C,ݸ֤OO1LIn +Y%avE,pI >$U3m܁IFۆ8YZ6{ְK$Os7%1=tdls*x3M{bfQP?RO=5:(RVf85pAAPk295ĕ"k; V gkTBsqpA P Ā$'89'CbnJkcE]??U8H;M@#ZkBp((6!J#Huw҈WA\sa]KKf  ; _[5t7@w?Կj+Կh ѶW7@m*e!Οm|[#3cL֥c6x$M4i7&ݣfFTnY=fȥkZn.'!XK#sW_.ƙ+C#Gpe"&bsN5=vH-"a2;\l*9~}#!KQqsHg",AeU5nϒb ^JQQX ke6!d/b2)<|sROͨ}6Kp(oe;n*k;;iYE{7'jug}ۖKW ,=8 ~-SAۋ[6X53 2r+FBxI$i - B@tޫ[HťA)UFW A_r~jo;xHU/^iHA,M;J^Aխnet{)_>jZuHb6ɻhϟ H$ y㐙ϣ5]==P$N=N3޹KMilnml9W0 #rm;@{ VE'Y@*ʪ'‡`*d)*IkA3<8[vmݞӶ+ uۙ+ysMu<ǢmC.ڞmGGȌ&@RDuڸ 3dsK$l0j_n҈R$b~Z(QE%q6ii 44N4@ 4Ci )4M4M4!+ok~!5,ި62@~bwq޽Pv ? ֏EMxz}t'!f>W![X^Gy ݃M aʁZ1<< -VS}gR֘+q\#'?tvtqHwzZǾƶq]Aqgkvb76aq$FHlqцz(S=s=j9ryYлcɬm]e5lfEshhݷ'jC0Nh=ߛ/GS=s=[4Z; b+v$8錑@#ڧzz??s?͗#AEsj9{T\6_]=ߛ/GS=s=tP?C~lGOeQ@#ڧzz??s?͗#AEsj9{T\6_]=ߛ/GS=s=tP?C~lo-^_xzV9*Z*%o/H"VGXMw9*..[+67~J\ȈbW B Mw0zS5K?XaW"t }.] 1 pOSkhHU/yCg=k+_TTبnYgn40ͽ,Hz#җ[*ӴFF:uWV5n8- S!ҭ\5V2yYTc\Y񎣤D<yolWq3$aMwTP7uX+uR. 5ܖhg2Ž x{8&t)l-.c:ɵ\=wE+_+ Vq8;6U03*ɝA, 3rTxPKLHdK)[#tP?m 60\`vAiu˨,o>4;Ԕh&Rbx!@֯\(zc%i3FxaNiXR9ơ01$`JyQ]s[-*|t޸UC]4m<+#q&n/P9ls&䷖e'*N>Lxez-Xeuţ9<?5)5"V8 "WInWEB7dop7ofkkxBvfFsZ#t%|c ’ O56vܵV'[]=ƶVR,#gpr~Qsҵ۹&D&''_c5{er P족Px=i~B8w3Ll 'i\%.&%zYl 3b>P>ax:g6S4kĺ'22:۷vb7[9Qʂ}p 64=0}.sSEjDC] 8ІTMIR@qӊj(B;qzc9"⿷|I@M+=Eq=~[m%" VL$ǽv~)Я-Z6'@W9$?];&r=-If;#?ҏg3H~6ڕ.:$A?JOi_5*(kZ1"Σ)CǰsOJV|x+xe3UQn⫓zwB[ ɽŠ(QEcIxPUZ<5$1j7BY6d2J0mdq6 wZr^Z}i]D0oV@ `LyQ@Q@Q@Q@Q@Q@Q@Q@ 4'TWVV PGqUm46k=>QC `=O\Q C iHQ@Utx~Q-l5]CdRD2lD 9#t@KS{4BjDgo$Gqko4OK}ſ?q/#UY[kk #qFzvҴYc oMOTa}ſ?q/#QDĿP,{˫;HqKľjpWtl>GpVHiOrO'%j>h8UԵKְCn$vڸ\;F.]!\0c {Ұ[@M5ko4OKNӶXWir\,d:JC$*rGA,P.ҋx|FB4ВqXsko4OK}ſ?q/#U׭R6ԛ<=z`u'l`}=.-nFxTN3-(Qo&_ _F~-&痻WGخ"PU'v1O376i|ip6c Qf>d7~-&~-&tde$(np1^Xv.6!J#:º]s u/- +o+lW?WR٨(((((((((o+lW?WR٫(((5i~$6z1C$J3껁:(?w?.lT!@̢Qvx@,γR5gcpJP,p.|'maɂ.ei2N$w*?<8K|Gܺ7vK6}kVwޗ- {j66v&VDNGJ?O'UZ)QEQEQEQEQEQEQEQEQEQEQEQEQEWijZ ٣ mJH\I"`uw[LCp9ғWv8daMKYE;U9?֜|k#)S]o`~YϤTPAF "1؂? D>fpkv@$J\[*A9^͢9|# F XnkH e8## 9ӱg7 i?2mk״jGl[FtO,d ru/,){4>fqG3Эv~ VֿO?],*&M[ q4Ή匕R=;n_Ώgg|_? iꤞ>Ht.捥-eR?BA~yd/|c-ՍImm-0p{8;:?Kn?WO?I e i뷂O9᷶xP)V}OP"yݐ֬[kfPpJ+_Y~}gZ; rk<(;5{(%7_+v_k6pJo-eifbsNI觠5`H?أ*qNe}@#Zԍ"@SBB((?$](>6!J#:º]s u/- +o+lW?WR٨(((((((((o+lW?WR٫((((((O<5`_W?O'UZ((((((((((((((dVRE)Z'ٔ\FJәoM~q-j[մi hޛ$UC@02^C`WQGTxE.b(#d޳"8(ÎmWTtPKՔ޲ʖy`N_ [7!N]\ep8%j.4YgZhoF0/ᷮPy5QEu lbӷeo һ.%G;1t.B< ֑-6o&edT) N@dףQG[sm~nHa_ '[(4z0-1`WQ\=W6қw3asi ZNٶw[Ƕvs'B5a`s4l?wq9'b)u{io"Fp=pGrXq;f(((((6!J#Huw҈WA\sa]KKf  ; _[5t7@w?Կj((((((u>f_p69'˲Giݸ1CO: E(EF@\I@5fqo]GKgsr\JI+~`UZ {V sU^>Y٭eX1!mPL]8ir-/W)?B?diڤWdD}j7֕Qse5כ?hq.^jC~l5 BM&ˎINrTp;Jis1ݓ%mVb9vy}1ZLG:zуP wi uF*G<0Iw]JyR[Ȭ #wzyn2E+@Aep7Wo B~"H5?e[ ឧo_nm`K&N8$u7X*v#WXYJ<'fILOpV OoYE0 nO]#ujurj7Y2w6cBJc_(_*6׵/g%wJj!G-gG=c^JUyXjkψwROذQFX6ݻ szuCF2(B(((O<5`_W?O'UZ((((((((((((((((((*E5tIu ((((((+*FWA\=W6Ҁ: ( ( ( ( ( (<ow:($](< ; _[5t7@w?Կj(WA\sa]KKf(((((WO7`_\7=Bo'QvXЪttMm?ߛ/GE`?ߛ/GO o= 7G?5e?ߛ/G Q>p͗#߭߫?GnV15/gh: - -Q5d6۬߫?1Q٬߫?1RR?G\ףWi7g귗v|,#9|}^8x(ڢ-Iwc kߺQ,NchR;Q/9Qox7%jOFĿV!ʹwXtA?w#5C)Uԥc-ŬrZ<`F$'+Ns?q/#UMO$ҴFiM ;j*Xaran..RG_,rxsVՖ]jmI%&5xUSI |%9tR$2>7 ?B+s0((((*E5tIu ((((((+*FWA\=W6Ҁ: ( ( ( ( ( (<ow:($](< ; _[5t7@w?Կj(WA\sa]KKf(((((WO7`_X>襭fEPEPԦ47ZVQ5K#jV[J+s^^sm%*uz5uCF2(B({ƿšwZ_AaM;KaZΡq (((((( JPeopyQ2ɿ~^O0ݮ|O_:+AF)lRtrv$Ewu: &[&"at$cQ[ A<=ROmux.]iH$hI뤾;Vgx 8OqíMyīO sh֛mY{,, rH%煃:xئ-$}Cp>aūߠ&ͥi1j3XZ} S"xV# rzzt="9gM.fM~s<\C-M!-Vڢ^ y60$Okztjs5$bʒ qX#9r1vg>~\qұ/:dAn@67|A4ڕkfǡh4iV),䴮 IcN@<4Ԏ]_rmF1uM4gJfY}ch|ȿuJ ԩi[ x-RD_,LcOJi:~ѯj6H{I1:q;q\ ;H&aMFm#`#FhfZ=zUlCn c kM;mck%b038GnSP[C ج :O9Š((((O?[ 7>Я!Eӧ6@ڣA(p)iQ}4%ʷ*TxR@|!η;MCMovZoXBʳH#E"XA Z euWvj31cID4ֿwyi:o_;㴆ni37~uC7~uZ 4XZo_;㴟iѠjmiC=7~u^ODuyih3hMb O4uyihFg"??s|)α;X,Մ&KTz|N!{AZ>t![I]O]8QEQEQEQEIu w$Ŀ M]QEQEQEQEQEQECѿm+~J`i@Q@Q@Q@Q@Q@Q@InQ|mCۿGEt u/-  ; _[5tW?WR٫PAEPEPEPEPEPEPEPEP?x±t{C,Ek]QEQEQEQEQEs5ӿnoNmnULXHc4 i[ jU֜uB `;V+Em83y2BTGfy}i[-`$PONO.>F ٜ9 A@iPmd%;CG$?+co$Gir-zsC'j[$:u_#ht.a@q+5K9$&q0H3xUau7lJ]Bӫ#P f$9~i 7+ -#9)[K\&j:K͆9Vw8 Tyja?'Ύ2#(x9݅. np29"[9m76U.\E4kUMFњnLu)QmDh'-.) I. @ey]ϗ=dڟP$EGd$@IoL}+S`'?TRvAM}m[ U 7d#qEܥQ=_9TMpZ\}~nd*n$pQPBXjo'Ե+;˒ZF6d>t7ѵ({ Tq3^^Zn4mSZ=wG{[!ǝ"\!XqU`<9v[izT#yulY慦ԷVl!81۩Jiƚi 4N4H4N4HiiMaxD6E5n mjkqt_ :ΌIA\?;oJt![saAUct?MUQ@aAUct?MUQ@aAUct?MUQ@aAUct?MUQ@xYѯFX/m䷑ ԩ 3k((((((+*FWA\=W6Ҁ: ( ( ( ( ( (<ow:($](< ; _[5t7@w?Կj(WA\sa]KKf((((((((gc+Z+f@SNiwam^ eTfd3ֲ5XOxm i BeNTC)O Wы"R8uyth Qs4G0I8nzg+%pRrw3/slh'7NوF66 [O ]F"fJa}9s=Io,[ ^L>:v?VZ52In;p #4WMycv t(>s*>=:Ѥ^[ Ȯ/VhݜMe{‘G-ЎJHd[ݘع(CFrN{c3ek]87/9݌M#m^:3F?|տ˩u|4cԣr -Вqnc3U IhѼ1!ndۣ==l>"-%6LݘEqIpx}F8OXNncٌvrI#w=VG8"bT7sz bi;iC$t6Gmt-Upfy=8;/`cxbib_0A%VoSQw%NK:)Gʭdc\%_!ۜx e+7n]RֱՒ7- ĩ0<9qޠOΓ}#d%goݍs8'> |˼$lsT|_ywn+%3E.#PҲJ/ȱwE1VB˃$19cִt]1?LH]gIVe"֑hR7A<{Vq-ݗ%`L9P6b}ps?JuԚFz\is:[K;+3$3sSx>ѦGyp [Uݶ=Np.9Kc4XVdex%feތ*wM.CM4M4ii 5?A`۟պk #?)u>t![I]O]0QEQEQEQEQEQEQEQEQEQEQEW?y%FU(z7mtQEQEQEQEQEQEy$:DtQInQx7@w?Կj+o+lP\sa]KKfº@Q@Q@Q@Q@Q@Q@Q@VvEC%Eom|I$ ?+ZAX~-5(`mB\0e(,UrtO5@Q@Q@m?a=yU(,$ƌ3 ۿťǪ_@;h᠎LLrrGak( %+]r{*Y%+I#d`@ڠ`t ?KmeξrC$[Ef 0y pKI'|̈d}^5ralwkB?-F4 m˂~\ zIgeg~][Mmrsy83SԓV"T6TJA~dc۷Ef*n&k[6Sb,Vܩq5e*.@c~8sI2.#%Cu+&kM^[ؿ>#Eu>`ji!A(G::{fԬS3Isj#%7zŻׯ-n*vk\Ƕrcޝz4`/K82՚B)\F:[ݷIwN8ϧZD;V-4*9 @;TDtĬ G) =.35at}E#\pL88@Gϓn/_<טPDVM dqɇbA~1*FzOi ۼo3gv13\5zo+l좝ko '!pܣxX\kq}w]o2d3F,}7g$Kii{~o$qʡdEu  A+="HţѦI I +tssWPiDw/˅9s^,ݛǷICi1ϙF7Nzr ^ބFJ_ήO -,®D*qͧ׋j1N;KdzLtoi62^d{c(h Ll\Kcp<Bw"pK^kIjR)(Xŷ<#*Ny簧\hepsY̐hHUp~Icu"/L[Hr'oUt ilH6ˎRAm/"-yth|:ڈdlQ6c qmM&FKG`[á$ΪYiwk5{9rM<$eKwZM\_}V15CJWo"sًnQb)qh3 $g=gE;}Y,,°2ı#|lz޹2V?4 VݮZ]@Jy.E zbykk K/wE)?IǮT= 95n0-RD̅-0>[N𦕤Au* T."! ($ԂO'/tyQ4FY;ǛvIj65.&CjR$JXV_Cv}N84߳1OoJ`R=椴Ӥ\7ygy \rO8i.Luq# +qrsܢzyo5|W_КȔg3F;x Ǖ q zyK^2[<:w6!0%N@ JotkhIe;\ N{}ƨ;sI+U sCM`Rcs4YѤb2\r"Iar6Jrysg(8"cX^3 M[hVdd$Q8$~Ft![I]O]0QEQEQEQEQEQEQEQEQEQEQEW?y%FU(z7mtQEQEQEQEQEQEy$:DtQInQx7@w?Կj+o+lP\^iͤMqG*44xRk9GOe=ߛ/G?s?͗#C~l ({T\6_G#ڧzz(S=s=j9렢9GOe=ߛ/G?s?͗#C~l ({T\6_G#ڧzz(S=s=s麾MmzkHhf;{G{}}o'i# (lX7:o R[ T߃5sS=s=?+ZA@#ڧzz??s?͗#AEsj9{T\6_]=ߛ/GS=s=tP?C~lGOeW/$lْ>o8:d n sj.X>񞹏e]IixzʼV6.}Cn#_lWsy%V= =ԟv Jϩx{NX9eX1PN33@Y?u{fk{Cnbry\qƽU4+_[۴Y 87ƿšwZ[pJ8y# 95DWF 2AVRxRs.j,Pܐ 3֭^[AԎ'6Sו*yP~IJZtynBW,U9ig򼟱n[wR ӴN+/4lP{HElrWSO7 g=Rܺ(skE>EʄwIj'$bْvhm2l- yg*s=9ŜR[E4ɸEHFch(U y0zcĨ_Q`}eݡvy`c}F7m)f/>F3,l2 L>b*`yxS ;,.[iKtbP4+$e1, >[RIKIEQPJp3(Q}=sOp(bH>*yڡ>&Ҿ}L#Im+p 94Ms~^zo"H< hFzF;w6VGLnn9$f%UC vo]i!#)|ʊQBT9dct6FY-?nfݻڳceZrssE "P67p6ӊMzg7~A&S1ww7c˞V=4B{`C,Ry,Ny5geЩiggq&Iӧ:\5f2U]EQO?uĊ@km`A*ݎnv ,e|, {}s"%hV]oWN?H8'qJ{StKn$]T*l ;(MOl)Bʹ p\Ш4t${ǜ]M!_+7}݌ΏM%u=ӈcL7Xvs0? OIQYNkhq+^a[Kw '<|ةlyHw/erʻc:ZoK[cP۽2GxV9$*"}F{ByA$`;@%S qϡK7E.lrUo`33Pى$`*\x1 ies:Ȫz6F,R| sLi?r fa!`H̻Nrx%Ԣ%}QfBCd0G=bE{a%z+<8-G~qZ-g}O3CrY㹸V26l9Y^/Rgg?G-tS[c ج :O9((((((((((((z7mtCѿm(((((((6!J#Huw҈WA\sa]KKf ( ( ( ( ( ( ( ( ռChEz&[Tv3m#V#kRDi 9h"Ul m'Z};]j(.o'm  qFtLWkiu v YcbeXdGs>'_ֺE-?Ұ?XºUE T`0ڰQEP((ZkM}lϰ1]yh7c֥ 6)k+? }yp((#rN MEs5ӿnq@mm-VDY`Fc i[ jU7FZqE.||~"5{p+KݵI$L7vחͫi_63 09%FCuWgE;0U ku1'&FBT`0$:_zh^I(l .3ۧs]j=bp*[Q?Ē6\TSezE}OD1®:+ұ3e5; ȸ[40Hp'n`6[leXC+H'Hf(R kW[Ή.n[+)W=?7VO7$#qnpVFQַ)TYWpWY$aQbc5kcOrO 6km9?{A7 cVњ&N#oxU=/M{M_tm3ԍބUѤiil4ldM?_"!7FyvTF@ r,3vzס*4NbtXCe$Wv1$օQ'? ߃kcG'~C?UtP? ߃kcG'~C?UtP? ߃kcG'~C?UtP? ߃kcG'~C?UtP? ߃kcG'~C?UtP? ߃kcG'~C?UtP? ߃kcG'~C?UtP? ߃kcG'~C?UtP? ߃kcG'~C?UtP? ߃kcG'~C?UtP? ߃kcYBu['J>p̶qgaEQEQEQEQEQEQEy$:DtQInQx7@w?Կj+o+lPEPEPEPEPEPEP54;x-XP?VÔI}oWj3  ?kG8roMZ;UeXtk2DNŅ9*ݍv_iZSQ9>S;}x_#Tqgwj7Z{V_NtoQ ֋<^񪙪&_a4]uŜ8W nGkWY$.$uW  <략u]ڳQEQEs^<3/$jZy$rp HCQ}ſ?q/#U i[ λ `"mH{Vs"I6ko4OK}ſ?q/#V85pAAU-GUM'iZʏ/n(3d (DĿG[@M5Q=1aӰOJb|ͨ=VTc%8UT0Pnz|>ɾh8_ _F5սի[$PoJ)!z=O3IiYG$s+H^%3Vg fW{X9kܗ~-&'%j]76kp(PF+lؤﱃDĿG[@M5oQHf[@M5ko4OKսE`ſ?q/#RDĿ[ߋ _Fſ?o/#W@ikg4_w7|@sşo/#RE[i\f_t_ԟk_toKռinU@m5'ڼU@m5oiq&_ѿm/#SM׊ _FM4O˟7>$'O;#2 N;d}Evg"??s𱑴̈˪1e r d{}m?'u?VvEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPmCۿGE@sa]KKfº]QEQEQEQEQEQEr襭? .E-oW;5 5 \6A8ƃ߮`/<ݡczqQg@FKMMV*XEiTRp;G暶C<]֓m^yRR$4 |ѡ;ޯI3Gn/r2O&[`1H$ vKhY,-Uw"!Pcw^8-:橯tHmѴmP,9ˌa]-jm6.|non8H`D1ŏ8Xf9OD$*DMA@>-մ/#Qc Md|#=HZh];Y vQw#fX k?/t^2n[e-++/|CE'b-;Z+ZP⸞- kS!;n~^)!ֶ4cP"Ic*vA\;pr';Z rvjjڵ߶OdMbAVrG5u&{ƌD1;+ݐc?sh{٦u{i-[[DC$0ܥHUp<~!;#]1iZ K`Gߡ~'k5{+i:nlbFKKv@+|I ,9&-ɏ|;W^3~lQmrhi{2kfi.yp`V>NO{&\eqiƚjJM8M ii 5?A`۟պk #?)u>t![I]O]0Q\m 5,k+h5$dPr*Z|AWkwq[F˱ QD@PrsBN5 u@di=Q%i75qm})yF|ǿhHndݲz=?Zl^N֯elKYncX>Fʡ;qrĚbӵMWSݗi&Pw@^hu^UQO+zg,M4hk,~<`ty*gw'"69 :g?=jZpz|h**0x#*W# z1\=[O.-qy#nnKl8<].z>.?^lEpȱ&d16H,kմkf&&Lӽ _ѵ:( ( ( + Wvk9Ǧ}8i4N4HbiiM4Ӎ4g"??sMaxD6E55Χ+b7 ?B+25n KqlI1by$V5S)mB(aYv>4BKheY2:F`V0H8E`QEQEQEQEQEs4 ӿ׬ i[ V.j,PGn۟鯶eq =EGAEaZ[=x#[<r}j61[Lb$:<n 84ރZ->5cnPO-FCJ R=A?JY(((tx.5GK䍡.'I)!O*U1[]̱D&bUC<`وs$c zEs~;fO +)!`A~ :* &gf$I$NOHGmCۿGE@sa]KKfº]QEQEQEQEQEQEr襭? .E-oW;5 ( (F51MRZXTMRDԘrJUyXjo)Wckѫ 1EUQEs5ӿn]ibeߛ2#4m 3i5ӿլ)+bd$Uqeĺ40̶tLB\,Kv#aZNM{a[L'8Ebs9nS9njggy?yrc 3gxau&t[8X|L?u͑_Ѵ+Zn+H8X7ry\qIY&9$D>@6!qIi}?F2F--bu+*FWA@Q@Q@Q@Q@Q@?4-;ZH[ U%@2e$q|i ?)l5Gw;KSl>Qjo#q#j_ hMk" *Gq"#mɹ I9棱kds6IDY!byN3\y-[>;Mm6 ~K"CӍg'*{#U;[]]%k ݘnaH[`N莎 鐠R/&5]Hޗ\4p)1|U*Tv;IqkzWWA` =<2W/7$*NV淯 ֶp)yJt>hf]d4~ w5 ;~ݙw/^V6ZF#% 8~"x->99,2% Z['~Ds,j.kD5$ۦ5ӁB$KLyrRwsz5y%;B[K cKpU#B hhW(`SوFEmʻRǓȒA(ZSEyXh^IC3l1봇'@KxTQ |Wf_3Iр襭fEPEPԦ47ZVQ5K#jV[J+s^^sm%*uz5uCF2(B({ƿšwM4P[}SGec!F9㷭;ƿšwOu/D0Bݦ`JH'HgڳĬV#U.@c'!}&c7N*@:Wh0YNA5Z+o*K!BHS9 d'KKw/l2A%[0:gMCcdwo(~fbG*߈MH'8wZg4qM;_rBpATXmZQPKsMmAm|lm}au%p`1to!)⳼>*$VyŚ9\36<[9J9]p ܹ+JI9i+.$ȧ+}۫mbI e<)³P~v,(f[i=vܴ5) # 8G=1[0Did1XV,y`G =DW)wٿ91J-bxx0U4C2ĠJ֝eC\M@`#e2GzzZMfiI[y .Xp @=4-I%Ee붷PnᕤfddDTnw)SbO`Aii1ҚCHiicM4Ӎ4iƚiM4M4i/ȏ覭X^3 MMn3 ج :O9(((~J`i]sPo_JҴt>;Kt%XaTԶ?^д4ӭc; #lʎ(BҧL-|EQѴ㺴T! >1NҬngWU!'+@(V_ڟ~Gf͞fEgk}q{ En.?ֶ;p? EQc7U%'$6- -al>!n}ТlModݗrM?]63] w,G`[٠  i[ Ikfyy q*ƄnX{>loDjzxEK3Am׫&jWq\Y^0OYB E5*+SKČ:b1j=;_ҵ[kKw䅋wl`1_C1YVco+1ި#I--UX-cdܠ  (y=S_-'-vسZq m1=y qXOrZ]&5lUB7O5]u+b Mk 8p3iMͩ-Fy9 ʑH)guhB_א;]cw`/-*X\G*dp8;-cKԡI5+;s<0*<9ǥTCc:|W*x8 ~aϨϵbx3Rӣ`kw6{yOF"I;9#ӊnhusnktu 19=i-;{ktStf9s+|w p:[᷷Dim7fX]]p =a4_kKk%-䪖8`'=Iy_uoic%k:r'k'KgU;D6u#brBsӁOzV%SKS$LhXX~j䲶#D[;{ml,!H`@!JB:K]B;+nmIapçpjjފ,7NeyZRXv<Չ5M {"]-s^=XBJgOa oUa oUDInQ|mCۿGEt u/-  ; _[5tQEQEQEQEQEQEz.szF]c609mID H>LwiVO?]Lۥ9 eg,*y\?6mom/ iA~`H?إȃ&Эv~M[[?u`H?أr goyIuE'u_ٔž|g1[Z?jx>մKГcحYϤQȃQemk2}>g>߱G,(qvpŗe}g⛓2-?w`H?أG:ѥ񤺌m͌/ fdfcn1"M2B#Jķp)(k ?)l5=W**"FNA?ƿšwM.5MA!vBᑁq{[fTkfy$Fʅ12sA㊲jdUWp3VVɦ[۲\Y{-Ci?0ܽHe'9ۡMrKe qnȻuF4fTTUQI3+}GP,E$q:$`NܨN1FkėB+R9oV?kh[eAec-\G$8Th\|IF6(akF8tD^(n ۈ-eEqhʷp19|^X6 ٣CQ<@5Χjo DlP H gn0yqR^ˈf]̦$9,H'lx^ͽY<% @%3+8^xzb kDq{"w3406tOxS緁Zdy0BLgyq5=KZb0FGIp LZ2$32bӍI-bGX!Ԑ{A=6zuͤ,ʖCH&ÐTS3k*7w|.ӈݔ ;**rvu6Hڥ&eUE c:yjMB[`6ֆYc3bhIl(4M4M44SHiM4M4 iqCM8M ii 5?A`۟պk #?)QӾ)xv)ll-V#>u|GjLX[ŜJc}b>_M[DS RG +AO4\L[\1+ ߃kcG'~C?UoR@P2I)#%dee951ס*nDybf RET5·m;I6|N՛#'(w?Q ߃kc[Vp_Euk*zhkpAI#dPVүϲ\$3-3g5Uk+oaYx]o$' 8pB>#"EX_[fy_%Fo0i@@ 4QEQEQEQEs4 ӿ3zͰ5}*1~=>4 ӿscgxpchlcrdt8_Q9[/P`o $Qc9g} ˀlTI,0n{8dx-,Rd0YEqNTM^nsVd4KCJ]/Orjkti2o}F3Cd~),lﴨMi$ H,7\6A‘a1,bi/m K\Shl"3nǣߋ4@p8P> |lFN=oWڜx[7M*i4CᢚP1#p~"7&<&B{mw+Inmͼ}Xo S\h Rjk\\/r^PpyldQjdw=Z|_ն g3mqG*I'<K;`-*FKͯ@A++vs0J_.n/nsa_'J5MIֻBŷۀtɣJZu5KxD<7{ѥyBo<,@t봝˛q+;b gk6li B>XA#ҳO|1:.#I`3\RoE#KIXQ࣫9͍Gt黊^-$=9'k[9g,;xUk=u1P/4(V jpJ= X;;u* E@ڜ:/a۵V1tjikxIm*nlNћMW Ix;N5^ %{:D1ws# Ѣ/*|o?4_F ?C(h9Co Ϣ|_U!?g>/*?C(nzO}s'ƾEOM|)C6UݟG#v;9O ͣ|_U'&FC(nzO}!eѿ>/*|goto???F ^wh`2X,g|A4fO4ڽ???F ~wh+bYYGa &r|g8VkS2ūi%i O$,qk}GOM\Dv\3^X;xu,XA3#'[V% y2G9o~G=k%SSS3yۖ \WyENki!:-=igHUEq)d)*c;p0y+V4kˤC6ivKser ۉ X`E;_!tH=gޓkegy'q P@G@l+=ݽ,|DhNFvNCtRJÿS,gk{7Fclj{_F9c]^ep g((QEQEs4 ӿ s-*KkUm.R{إ[mVDv1>QU `9pzO?Ϧzboê݋,'<ݬ&h_ _1^K(apwHqnK+`kdCTJXȨo|cZC2dYJ I@8`WkJmB(FEK;Nd&XR8mf-ɃM ԃv[αZȢC7]P6W txEaa +=!V*!V)y$:DtQInQx7@w?Կj+o+lPEPEPEPEPEPEPEPEPEP?WR٫WA@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@u6VkKb#+)2A"Ѭf.$9f'vKwdM_!kH^+L4h<+,1ӝTQ@Q@Q@Q@Q@Q@Q@Q@?4-[zۣB̈d27;G+=jt [ܥqrCE2JPH%1u ʗ#$͐dz4 ;_Y(+)I-Ӧ)`}KPkvghtrmAxly>?4y>?4KXO\yg$RĖryf(VB m7@ӊf]/G38Vv6AĀϽ3.I.I\NwQLW@P,6ֱ<%THAoOp=ط D湹K#K4F.I'(bΉ<ΉaZU_ uDzvW8S,uq;&A$6nU&ryb.I.I/[xVڤ1ڑ1\* QNpwv4!HIo|q屁O|?:' h|?:' i[BZ24Z0o"X `A^qaŔ6pC* &7.RI1YODsMODsM $hԆ%drp:ss=XBJᨼΉ䚩3-. ,|V@%z;{[$BT6YA2ƪG#6!J#Huw҈WA\sa]KKf ( ( ( ( ( ( ( ( Kb%^WzX%KmB{uYw(duEv:mK1ځvZ=!} P4SWŖ u[]ބvBc,m2Frgzq mn Ao*g/İƔomF (AEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPmCۿGE@sa]KKfº]QEQEQEP$innvK p9'zr襨Q-;5?ӿ\+;/D?{{hKNsvh,/D?{{hKNsvh,/D?{{hKNsvh,/D?{{hKNsvh,n%-jѳ)x9'^ML|';[EY'– ;[is>da X;M^u^4K|/e?/4f^4K|3g?/?E.Ե԰P_^p2$ZZm"i&y\UƓInn wk&]a#JBr,I')>tGABR۷8zdΔr^/Ipdl1w^%f>_9ikqbx$X,]eQ#W]Eb=Z.;H&]Zx yR+^}Rn &kt[iy$6mܞת:'63(((((((((((((((((((((((((((((((((6!J#Huw҈WA\sa]KKf ( ( ( |$ K]Ur襬z( ( ( ( 6<=OoeyLQ'xպOW/G{Z &ᴶ̨vLD9A0Fn-xRH $c\EΗ#l׈~+x>ȶN f/';;sooxVKq~Ip+4[ U E%=Z4XԬg[qpm*O MnE tWL]owjL4G{ƪ-\H*Xܐ9=jͽ\Z8IVphN2[iQ >lhSxe?˭iOr-S3wwc99LQt 2{#? 3}ui~>iǧA+5'h3X5; #ym}m53* u][>/[iVkzLE,Z,TnCA'ǽ55"X'=REBF9t>Iv3ϋֿIyƩiV֕dܜA!B}* ik6jYO9riogi67)SOtKyƫV[x ye`A o?4Nmgj/5++ӿY-V7dx51kFqzηijїPv&OgzDPO=3ʽBA? 7Wa oWE/{(Ѐ((((((((((((((((((((((((((((((((6!J#Huw҈WA\sa]KKf ( ( ( -j <=i}mZ%@>R2+WO7`_Euf]6Ӻ46I8 `,h' 2{5;%Դ&`n#k%]ʅv:C?4Kaj͜wZZYWgކAˆ۹T&yw_е_=[FhSݯuȵK{-"x ųJ>K\(>ʹŭ ռ>`c7۷# tjyQNek=gtƱ<6s޴8 [~\݇_^ث&h"So 7WX:'x?9a&[?m\ ܱEVQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@InQ|mCۿGEt u/-  ; _[5tQEQEQEWx;>qqimI$ƤJ{ע+']Z_+h/ Э/&Y?V?_G [D|_MoQE_+h/ Э/&`/O?V?_[Qp0 ' h_+h/(?Km4 Э/& is_D|_M4#+/M+> /E /EWac+Ÿ,hM> :7E.c/¿,M> :7EWc|oox[bktM+8wZ ,M6C6vٕOڽNA? 7Wa oWE/{(Ѐ((((((((((((((((((((((((((((((((6!J#Huw҈WA\sa]KKf ( ( ( /~^`hZ< WNW_Ep<7@+  ҿ]wP  ҿ]<7@+qEp<7@+  ҿ]wP  ҿ]<7@+qEp<7@+  ҿ]wP  ҿ]<7@+qEp<7@+  ҿ]wP  ҿ]<7@+qEp<7@+  ҿ]wP  ҿ]<7@+qEp<7@+  ҿ]wPkDKK=>taDe AoYݱ*J((((((((((((((((((((((((((((((((((6!J#Huw҈WA_xŞ$ Namespaces — PyXB 1.2.6 documentation

Namespaces

The most important concept to understand when working with complex XML documents is the namespace. A namespace is nothing more than a map from names to objects, partitioned into groups within which the names must uniquely identify an object.

A namespace is identified by its name, which is a URI. Although it is common to use URIs like http://www.w3.org/2001/XMLSchema as namespace names, the name is simply an opaque identifier: it does not have to resolve to a Web site or anything helpful. dinner:ParsnipsOnTuesday is a perfectly valid namespace name.

Equally, namespaces and XML schemas are not the same thing. A schema is simply a mechanism for specifying the contents of a namespace. It is common to use the include directive in XMLSchema to combine multiple schema into a single namespace. It is less common, though equally valid, to use xmlns or xs:schemaLocation to select alternative schemas to use for the same namespace in different instance documents, as in the dangling type pattern.

This diagram shows the class structure of the PyXB namespace infrastructure. The central object is the pyxb.namespace.Namespace. Four mix-in classes provide implementations of separate namespace functions. pyxb.namespace.ExpandedName is used ubiquitously to pair local names with their namespaces. pyxb.namespace.NamedObjectMap maps names to the objects (generally, schema components) for a particular category of object. The pyxb.namespace.NamespaceContext class provides information related to the use of namespaces in XML documents, including mappings from prefixes to namespaces.

_images/NamespaceCore.jpg

Namespace Category Maps

The pyxb.namespace._NamespaceCategory_mixin provides support for discrete categories of named objects. It allows arbitrary, runtime-identified, groups of objects to be registered in individual dictionaries within the namespace. For example, XML Schema require that type definitions, element declarations, and attribute declarations be distinct categories of named objects in a namespace. PyXB also maintains separate categories for attribute groups, model groups, identity constraint definitions, and notation declarations, which also must be unique within their category.

Other groups of objects can be stored in a namespace. For example, the WSDL definition of a service may choose to use the same namespace name for its types as for its definitions, adding services, ports, messages, bindings, and portTypes as named objects that can be identified.

Namespace Component Associations

The pyxb.namespace._NamespaceComponentAssociation_mixin provides support for associating schema components with a namespace. Of particular interest is that a namespace can be comprised of components defined from multiple sources (generally, distinct schema documents). In addition, there are anonymous components (e.g., complex types defined within element members of complex types) which are implicitly associated with the namespace although they cannot be named within it. These must all be stored within the namespace so that a complete set of bindings can be generated in a single Python module.

Namespace Resolution

Named objects are often associated with namespaces through XML elements in a document. For example:

<xs:attribute xmlns:xs="http://www.w3.org/2001/XMLSchema"
 name="vegetable" type="xs:string" default="parsnip"/>

specifies an attribute declaration. In turn, references to names appear within XML elements, usually as values of specific attributes. The type portion of the attribute declaration above also identifies an object by name, and it must be possible to resolve the named object. The work involved in associating names with schema components is encapsulated in the pyxb.namespace.resolution._NamespaceResolution_mixin class.

The following concepts are important to understand:

  • An NCName (“no-colon name”) is an identifier, specifically one without any colon (”:”) characters, serving as a local name.
  • A QName (“qualified name”) is an local name with an optional prefix, separated from it by a colon, which identifies a context for the local name.
  • The prefix is mapped using xmlns attributes to a namespace name, which is a URI.
  • The combination of a namespace URI and the local name comprise an expanded namespace name, which is represented by pyxb.namespace.ExpandedName.
  • The category within which the local name must be resolved in the namespace is determined through external information, in the above case the fact of the QName’s appearance in a type attribute in an attribute declaration of an XML schema.

pyxb.namespace._NamespaceCategory_mixin is used to define the set of categories supported by a namespace and to add named objects to those categories. A name is resolved when the object with which it is associated has been identified. Objects are resolved when any names on which they depend have been resolved. pyxb.namespace.resolution._NamespaceResolution_mixin provides a mechanism to hold on to names that have been encountered but whose associated objects have not yet been resolved (perhaps because the named object on which they depend has not been defined).

Because one named object (e.g., a model group definition) might require resolution of another (e.g., an element reference), resolution is an iterative process, implemented by pyxb.namespace.resolution._NamespaceResolution_mixin.resolveDefinitions, and executed when all named objects have been added to the namespace. It depends on pyxb.namespace.resolution.NamespaceContext to identify named objects using the pyxb.namespace.resolution.NamespaceContext.interpretQName method.

Expanded Names

An pyxb.namespace.ExpandedName instance couples a local name with (optionally) a namespace, resulting in a QName. This class also integrates with namespace categories, permitting lookup of the object with its name in a specific category by using the category name as a method. For example, the following two expressions are equivalent:

# Short-hand method
en.typeDefinition()
# Detailed equivalent
en.namespace().categoryMap('typeDefinition').get(en.localName())

Both produce the type definition with the given name, or None if there is no such definition. The short-hand method interface works for any category defined within the expanded name’s namespace; it is not limited to the standard set of component categories.

Methods are also present to test whether the name matches a DOM node, and to retrieve the named attribute (if present) from a DOM node.

In this version of PyXB, the hash codes and comparison methods for ExpandedName have been overridden so that an expanded name with no namespace is treated equivalently to the string value of the local name. This simplified management of default namespace lookups in earlier versions of PyXB, but may no longer be necessary; reliance on this feature is discouraged.

Namespace Context

Namespaces in XML specifies how the xmlns attributes are used to associate prefix strings with namespaces. The pyxb.namespace.NamespaceContext class supports this by associating with each node in a DOM document the contextual information extracted from xmlns and other namespace-relevant attributes.

The namespace context consists of three main parts:

  • The default namespace specifies the namespace in which unqualified names are resolved.
  • The target namespace is the namespace into which new name-to-component associations will be recorded.
  • The in-scope namespaces of a DOM node are those which can be identified by a prefix applied to names that appear in the node.

Methods are provided to define context on a per-node basis within a DOM structure, or to dynamically generate contexts based on parent contexts and local namespace declarations as needed when using the SAX parser.

Other Concepts

Absent Namespaces

Some schemas fail to specify a default namespace, a target namespace, or both. These cases are described by the term “absent namespace”; sometimes it is said that an object for which the target namespace is absent is in “no namespace”.

If the target namespace for a schema is absent, we still need to be able to store things somewhere, so we represent the target namespace as a normal pyxb.namespace.Namespace instance, except that the associated URI is None. If in the same schema there is no default namespace, the default namespace is assigned to be this absent (but valid) target namespace, so that QName resolution works. Absence of a target namespace is the only situation in which resolution can succeed without some sort of namespace declaration.

The main effect of this is that some external handle on the Namespace instance must be retained, because the namespace cannot be identified in other contexts. PyXB supports this by defining a Namespace variable within each binding module, thus allowing access to the namespace instance via syntax like pyxb.bundles.wssplat.wsdl11.Namespace.

Storage of Namespaces

In PyXB, when the Component Model is used to define various elements, attributes, and types by representing them in Python instances, those instance objects are stored in a pyxb.namespace.Namespace instance. In addition to generating code corresponding to those objects, it is possible to save the pre-computed objects into a file so that they can be referenced in other namespaces.

PyXB uses the Python pickling infrastructure to store the namespace component model into a file in the same directory as the generated binding, but with a suffix .wxs. When a schema is processed that refers to a namespace, the serialized component model for the namespace is read in so that the referring namespace can resolve types in it.

The Namespace Archive Model

Recall that the contents of a namespace can be defined from multiple sources. While in the simplest cases the namespace is defined by combining components from one or more schemas, the set of schemas that define a namespace may be different for different documents. One way this is used is the dangling types<http://www.xfront.com/VariableContentContainers.html#method4> pattern.

Another not uncommon situation is to use a namespace profile, which is a subset of the full namespace intended for use in a particular application. For example, the Geography Markup Language defines three profiles denoted “GML-SF” for “simple features”; these profiles do not include the more complex structures that are needed for unusual situations.

Finally, some use cases require that a namespace be extended with application-specific information provided in a schema that adds to rather than replaces the base namespace definition. As with profiles these extensions should be provided in separate Python modules, but unlike profiles the original binding must be imported separately to provide the application’s perspective of the full namespace content.

To support these cases, PyXB must:

  • Support distinct Python binding modules for one namespace (e.g., dangling type implementations and profiles)
  • Support shared Python binding modules for one namespace (e.g., a base namespace with application-specific extensions)
  • Ensure the component model for each binding module is retained within a single archive regardless of whether that component model is complete for the module’s namespace

Naive management of these multiple information sources will cause havoc, since namespaces do not allow multiple objects to share the same name.

The relations of the various classes involved in storing namespace data are depicted in the following diagram:

_images/NamespaceArchive.jpg

The namespace archive facility must support the following situations:

  • The archive stores the complete set of components for a single namespace (most common)
  • The archive stores components from multiple namespaces which are interdependent, but together completely define the expected contents of the namespaces
  • The archive stores a complete subset of the standard components of a namespace (the profile situation)
  • The archive extends a namespace with additional components, often required for a particular application. It is usually necessary to read another archive to determine the full namespace content.

Because of interdependencies between namespaces stored in a single archive, archives are read as complete entities: i.e., from a single archive you cannot read the components corresponding to one namespace while ignoring those from another.

The component model for a namespace is read from a namespace archive only when it is necessary to generate new bindings for a namespace that refers to it, through import or namespace declarations. The component model is defined by invoking the pyxb.namespace.Namespace.validateComponentModel method.

Within an archive, each namespace can be marked as private or public. When the component model for a namespace is validated, all archives in which that namespace is present and marked public are read and integrated into the available component models.

When an archive is read, namespaces in it that are marked private are also integrated into the component model. Prior to this integration, the namespace component model is validated, potentially requiring the load of other archives in which the namespace is marked public.

The contents of the namespace archive are:

  • A set of pyxb.namespace.archive._ModuleRecord instances which identify namespaces and mark whether they are public or private in the archive. Each instance in turn contains (for namespace A):
    • the set of pyxb.namespace.archive._ObjectOrigin instances which identify the origins for components that are defined in the archive. In turn, each of these origins identifies by category and name the objects that were defined by this origin and consequently are stored in the containing archive. Due to use of the include directive, multiple origins may be associated with a single module record
    • the set of pyxb.namespace.Namespace instances that were referenced by A. This includes namespaces that were imported into one of the origin objects, as well as those that were incorporated simply through reference to an object in a declared namespace
  • The objects within the namespace that were defined by the various origins

In addition to the raw component model, the namespace archive includes the names of the Python modules into which bindings for each namespace were generated.

PyXB-1.2.6/doc/html/architecture.html0000644000175000017500000002075713152762222016766 0ustar pabpab00000000000000 Architecture — PyXB 1.2.6 documentation

Architecture

The architecture of PyXB requires an understanding of four models. Namespaces describe how objects are aggregated by name and kind. The Component Model represents XML schema using the thirteen component types defined in the XML schema specification. The Binding Model describes how Python classes provide a Pythonic representation of the information within specific components. Finally, the Content Model describes how the component model of a specific schema supports translation between XML documents and Python bindings.

PyXB-1.2.6/doc/html/limitations.html0000644000175000017500000002457413152762222016641 0ustar pabpab00000000000000 Limitations — PyXB 1.2.6 documentation

Limitations

Things That Work

  • Class constants corresponding to string enumeration constraints
  • Simple and complex type definitions
  • List and union datatypes
  • Constraints on (simple) datatypes (e.g., minInclusive, length)
  • Model groups and attribute groups
  • Complex content models (all, sequence, choice); minOccurs and maxOccurs
  • Abstract types, xsi:type, substitution groups
  • Nillable elements with xsi:nil
  • Namespace qualified attributes and elements
  • Documentation annotations present in the schema are converted to Python docstrings in the generated bindings.
  • Pattern constraints (as long as the simple type derives from something that is represented as a Python string)

Things That Don’t Work

...but could someday

  • Identity constraints (“key”, “unique”, “keyref”) are stored in the content model, but are not used.
  • Wildcard elements are supported in the sense that classes that enable them in the content model provide access to unrecognized values through the pyxb.binding.basis.complexTypeDefinition.wildcardElements method. Where the type of the node is recognized, it is converted to a Python binding instance; otherwise, the xml DOM instance is stored. Although namespace constraints are applied when checking for wildcard matches, the process contents attribute of the wildcard is ignored.
  • Wildcard attributes are supported in much the same sense as wildcard elements: no constraints are checked, and all are aggregated into the pyxb.binding.basis.complexTypeDefinition.wildcardAttributeMap. Values are uninterpreted Unicode strings.

...and probably never will

  • The redefine directive is not supported.
  • The ability to use templates to customize binding generation was promised in the vision document, but after three years of no plausible use case it is no longer part of the plan.

Things That Mostly Work, But They’re Ugly

  • The duration type is based on the Python datetime.timedelta class, which works reasonably well for small deltas but does not handle month and year deltas. The PyXB version records that information, but the timedelta functionality (adding/substracting from datetime instances) does not incorporate that portion of the delta. Negative durations also may not work properly.
PyXB-1.2.6/doc/html/bundles.html0000644000175000017500000020104013152762222015722 0ustar pabpab00000000000000 Examples of Supported Schema — PyXB 1.2.6 documentation

Examples of Supported Schema

PyXB comes with pre-defined bundles which aggregate related namespaces into pre-generated bindings that allow you to use them without having to generate and manage them yourself. These bundles also demonstrate the complexity of schema that PyXB is prepared to handle. Not all namespaces have been fully tested, but they are expected to function correctly.

Although the generating scripts and infrastructure are part of PyXB proper, not all these bundles may have been pre-built in your PyXB distribution. See Generating Bundled Bindings for details on building these bundles.

common

The following namespaces are available in support of general XML use:

Binding Module Namespace
pyxb.bundles.common.xhtml1 http://www.w3.org/1999/xhtml
pyxb.bundles.common.xlink http://www.w3.org/1999/xlink
pyxb.bundles.common.xsd_hfp http://www.w3.org/2001/XMLSchema-hasFacetAndProperty

WS-*

The following namespaces are available in support of web service development:

Binding Module Namespace
pyxb.bundles.wssplat.bpws http://schemas.xmlsoap.org/ws/2003/03/business-process/
pyxb.bundles.wssplat.ds http://www.w3.org/2000/09/xmldsig#
pyxb.bundles.wssplat.httpbind http://schemas.xmlsoap.org/wsdl/http/
pyxb.bundles.wssplat.mimebind http://schemas.xmlsoap.org/wsdl/mime/
pyxb.bundles.wssplat.sawsdl http://www.w3.org/ns/sawsdl
pyxb.bundles.wssplat.soap11 http://schemas.xmlsoap.org/soap/envelope/
pyxb.bundles.wssplat.soap12 http://www.w3.org/2003/05/soap-envelope
pyxb.bundles.wssplat.soapbind11 http://schemas.xmlsoap.org/wsdl/soap/
pyxb.bundles.wssplat.soapbind12 http://schemas.xmlsoap.org/wsdl/soap12/
pyxb.bundles.wssplat.soapenc http://schemas.xmlsoap.org/soap/encoding/
pyxb.bundles.wssplat.whttp http://www.w3.org/ns/wsdl/http
pyxb.bundles.wssplat.wsa http://www.w3.org/2005/08/addressing
pyxb.bundles.wssplat.wsam http://www.w3.org/2007/02/addressing/metadata
pyxb.bundles.wssplat.wscoor http://docs.oasis-open.org/ws-tx/wscoor/2006/06
pyxb.bundles.wssplat.wsdl11 http://schemas.xmlsoap.org/wsdl/
pyxb.bundles.wssplat.wsdl20 http://www.w3.org/ns/wsdl
pyxb.bundles.wssplat.wsdli http://www.w3.org/ns/wsdl-instance
pyxb.bundles.wssplat.wsdlx http://www.w3.org/ns/wsdl-extensions
pyxb.bundles.wssplat.wsnt http://docs.oasis-open.org/wsn/b-2
pyxb.bundles.wssplat.wsoap http://www.w3.org/ns/wsdl/soap
pyxb.bundles.wssplat.wsp200607 http://www.w3.org/2006/07/ws-policy
pyxb.bundles.wssplat.wsp http://www.w3.org/ns/ws-policy
pyxb.bundles.wssplat.wsrf_bf http://docs.oasis-open.org/wsrf/bf-2
pyxb.bundles.wssplat.wsrf_br http://docs.oasis-open.org/wsn/br-2
pyxb.bundles.wssplat.wsrm http://docs.oasis-open.org/ws-rx/wsrm/200702
pyxb.bundles.wssplat.wsse http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd
pyxb.bundles.wssplat.wstop http://docs.oasis-open.org/wsn/t-1
pyxb.bundles.wssplat.wsu http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd
pyxb.bundles.wssplat.xenc http://www.w3.org/2001/04/xmlenc#

SAML

The following namespaces are available in support of the Security Assertion Markup Language:

Binding Module Namespace
pyxb.bundles.saml20.assertion urn:oasis:names:tc:SAML:2.0:assertion
pyxb.bundles.saml20.dce urn:oasis:names:tc:SAML:2.0:profiles:attribute:DCE
pyxb.bundles.saml20.ecp urn:oasis:names:tc:SAML:2.0:profiles:SSO:ecp
pyxb.bundles.saml20.metadata urn:oasis:names:tc:SAML:2.0:metadata
pyxb.bundles.saml20.protocol urn:oasis:names:tc:SAML:2.0:protocol
pyxb.bundles.saml20.x500 urn:oasis:names:tc:SAML:2.0:profiles:attribute:X500
pyxb.bundles.saml20.xacml urn:oasis:names:tc:SAML:2.0:profiles:attribute:XACML

Dublin Core

The following namespaces are available in support of the Dublin Core(R) Metadata Initiative.

Binding Module Namespace
pyxb.bundles.dc.dc http://purl.org/dc/elements/1.1/
pyxb.bundles.dc.dcmitype http://purl.org/dc/dcmitype/
pyxb.bundles.dc.dcterms http://purl.org/dc/terms/

ECMA-376 (Open Office XML)

ECMA 376 aka “Office Open XML” aka “ISO/IEC 29500” is a standard for XML-based office software suite documents, including Microsoft Office 2007 and 2010.

This bundle is not populated in the distributed versions of PyXB because it requires some 250MB of space to hold the schemas, generated bindings, and archive files. To build it, set PYXB_ROOT environment variable to the absolute path of the unpacked PyXB distribution (the directory containing setup.py) and run these commands:

cd ${PYXB_ROOT}
pyxb/bundles/ecma376/scripts/genbind

This will download the schemas from OGC and generate bindings for both sets of namespaces below.

Note that there are two incompatible schema sets which share namespaces. Import only one. If you wish to extend the classes in these namespaces, ensure your PYXB_ARCHIVE_PATH includes only the one you intend to extend.

ECMA-376 1st Edition (2006)

The first edition of ECMA-376 was a transitional version leading to ISO/IEC 29500, but is not compatible with that standard. It may be needed for older documents, including those processed by Microsoft Office 2007.

Binding Module Namespace
pyxb.bundles.ecma376.v2006.dml.audioVideo http://schemas.openxmlformats.org/drawingml/2006/main
pyxb.bundles.ecma376.v2006.dml.chartDrawing http://schemas.openxmlformats.org/drawingml/2006/chartDrawing
pyxb.bundles.ecma376.v2006.dml.chart http://schemas.openxmlformats.org/drawingml/2006/chart
pyxb.bundles.ecma376.v2006.dml.compatibility http://schemas.openxmlformats.org/drawingml/2006/compatibility
pyxb.bundles.ecma376.v2006.dml.diagramColorTransform http://schemas.openxmlformats.org/drawingml/2006/diagram
pyxb.bundles.ecma376.v2006.dml.lockedCanvas http://schemas.openxmlformats.org/drawingml/2006/lockedCanvas
pyxb.bundles.ecma376.v2006.dml.picture http://schemas.openxmlformats.org/drawingml/2006/picture
pyxb.bundles.ecma376.v2006.dml.spreadsheetDrawing http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing
pyxb.bundles.ecma376.v2006.dml.wordprocessingDrawing http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing
pyxb.bundles.ecma376.v2006.opc.contentTypes http://schemas.openxmlformats.org/package/2006/content-types
pyxb.bundles.ecma376.v2006.opc.coreProperties http://schemas.openxmlformats.org/package/2006/metadata/core-properties
pyxb.bundles.ecma376.v2006.opc.digSig http://schemas.openxmlformats.org/package/2006/digital-signature
pyxb.bundles.ecma376.v2006.opc.relationships http://schemas.openxmlformats.org/package/2006/relationships
pyxb.bundles.ecma376.v2006.pml.animationInfo http://schemas.openxmlformats.org/presentationml/2006/main
pyxb.bundles.ecma376.v2006.shared.additionalCharacteristics http://schemas.openxmlformats.org/officeDocument/2006/characteristics
pyxb.bundles.ecma376.v2006.shared.bibliography http://schemas.openxmlformats.org/officeDocument/2006/bibliography
pyxb.bundles.ecma376.v2006.shared.customXmlDataProperties http://schemas.openxmlformats.org/officeDocument/2006/customXml
pyxb.bundles.ecma376.v2006.shared.customXmlSchemaProperties http://schemas.openxmlformats.org/schemaLibrary/2006/main
pyxb.bundles.ecma376.v2006.shared.documentPropertiesCustom http://schemas.openxmlformats.org/officeDocument/2006/custom-properties
pyxb.bundles.ecma376.v2006.shared.documentPropertiesExtended http://schemas.openxmlformats.org/officeDocument/2006/extended-properties
pyxb.bundles.ecma376.v2006.shared.documentPropertiesVariantTypes http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes
pyxb.bundles.ecma376.v2006.shared.math http://schemas.openxmlformats.org/officeDocument/2006/math
pyxb.bundles.ecma376.v2006.shared.relationshipReference http://schemas.openxmlformats.org/officeDocument/2006/relationships
pyxb.bundles.ecma376.v2006.sml.autoFilter http://schemas.openxmlformats.org/spreadsheetml/2006/main
pyxb.bundles.ecma376.v2006.vml.main urn:schemas-microsoft-com:vml
pyxb.bundles.ecma376.v2006.vml.officeDrawing urn:schemas-microsoft-com:office:office
pyxb.bundles.ecma376.v2006.vml.presentationDrawing urn:schemas-microsoft-com:office:powerpoint
pyxb.bundles.ecma376.v2006.vml.spreadsheetDrawing urn:schemas-microsoft-com:office:excel
pyxb.bundles.ecma376.v2006.vml.wordprocessingDrawing urn:schemas-microsoft-com:office:word
pyxb.bundles.ecma376.v2006.wml http://schemas.openxmlformats.org/wordprocessingml/2006/main

ECMA-376 2e/3e/4e (2008)

The ISO/IEC 29500:2008 version has distinct transitional and strict hierarchies. Use one or the other. The packaging schema are shared between these versions, and in fact appear to be unchanged from the 2006 schema except for comments and other whitespace in the schema documents. The various editions contain changes intended to increase conformance to ISO/IEC 29500:2008 and the bundle script is configured to build the 4th edition (December 2012).

Binding Module Namespace
pyxb.bundles.ecma376.v2008.opc.contentTypes http://schemas.openxmlformats.org/package/2006/content-types
pyxb.bundles.ecma376.v2008.opc.coreProperties http://schemas.openxmlformats.org/package/2006/metadata/core-properties
pyxb.bundles.ecma376.v2008.opc.digSig http://schemas.openxmlformats.org/package/2006/digital-signature
pyxb.bundles.ecma376.v2008.opc.relationships http://schemas.openxmlformats.org/package/2006/relationships
pyxb.bundles.ecma376.v2008.strict.dml.chartDrawing http://purl.oclc.org/ooxml/drawingml/chartDrawing
pyxb.bundles.ecma376.v2008.strict.dml.chart http://purl.oclc.org/ooxml/drawingml/chart
pyxb.bundles.ecma376.v2008.strict.dml.diagram http://purl.oclc.org/ooxml/drawingml/diagram
pyxb.bundles.ecma376.v2008.strict.dml.lockedCanvas http://purl.oclc.org/ooxml/drawingml/lockedCanvas
pyxb.bundles.ecma376.v2008.strict.dml.main http://purl.oclc.org/ooxml/drawingml/main
pyxb.bundles.ecma376.v2008.strict.dml.picture http://purl.oclc.org/ooxml/drawingml/picture
pyxb.bundles.ecma376.v2008.strict.dml.spreadsheetDrawing http://purl.oclc.org/ooxml/drawingml/spreadsheetDrawing
pyxb.bundles.ecma376.v2008.strict.dml.wordprocessingDrawing http://purl.oclc.org/ooxml/drawingml/wordprocessingDrawing
pyxb.bundles.ecma376.v2008.strict.pml http://purl.oclc.org/ooxml/presentationml/main
pyxb.bundles.ecma376.v2008.strict.shared.additionalCharacteristics http://purl.oclc.org/ooxml/officeDocument/characteristics
pyxb.bundles.ecma376.v2008.strict.shared.bibliography http://purl.oclc.org/ooxml/officeDocument/bibliography
pyxb.bundles.ecma376.v2008.strict.shared.commonSimpleTypes http://purl.oclc.org/ooxml/officeDocument/sharedTypes
pyxb.bundles.ecma376.v2008.strict.shared.customXmlDataProperties http://purl.oclc.org/ooxml/officeDocument/customXml
pyxb.bundles.ecma376.v2008.strict.shared.customXmlSchemaProperties http://purl.oclc.org/ooxml/schemaLibrary/main
pyxb.bundles.ecma376.v2008.strict.shared.documentPropertiesCustom http://purl.oclc.org/ooxml/officeDocument/customProperties
pyxb.bundles.ecma376.v2008.strict.shared.documentPropertiesExtended http://purl.oclc.org/ooxml/officeDocument/extendedProperties
pyxb.bundles.ecma376.v2008.strict.shared.documentPropertiesVariantTypes http://purl.oclc.org/ooxml/officeDocument/docPropsVTypes
pyxb.bundles.ecma376.v2008.strict.shared.math http://purl.oclc.org/ooxml/officeDocument/math
pyxb.bundles.ecma376.v2008.strict.shared.relationshipReference http://purl.oclc.org/ooxml/officeDocument/relationships
pyxb.bundles.ecma376.v2008.strict.sml http://purl.oclc.org/ooxml/spreadsheetml/main
pyxb.bundles.ecma376.v2008.strict.wml http://purl.oclc.org/ooxml/wordprocessingml/main
pyxb.bundles.ecma376.v2008.transitional.dml.chartDrawing http://schemas.openxmlformats.org/drawingml/2006/chartDrawing
pyxb.bundles.ecma376.v2008.transitional.dml.chart http://schemas.openxmlformats.org/drawingml/2006/chart
pyxb.bundles.ecma376.v2008.transitional.dml.diagram http://schemas.openxmlformats.org/drawingml/2006/diagram
pyxb.bundles.ecma376.v2008.transitional.dml.lockedCanvas http://schemas.openxmlformats.org/drawingml/2006/lockedCanvas
pyxb.bundles.ecma376.v2008.transitional.dml.main http://schemas.openxmlformats.org/drawingml/2006/main
pyxb.bundles.ecma376.v2008.transitional.dml.picture http://schemas.openxmlformats.org/drawingml/2006/picture
pyxb.bundles.ecma376.v2008.transitional.dml.spreadsheetDrawing http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing
pyxb.bundles.ecma376.v2008.transitional.dml.wordprocessingDrawing http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing
pyxb.bundles.ecma376.v2008.transitional.pml http://schemas.openxmlformats.org/presentationml/2006/main
pyxb.bundles.ecma376.v2008.transitional.shared.additionalCharacteristics http://schemas.openxmlformats.org/officeDocument/2006/characteristics
pyxb.bundles.ecma376.v2008.transitional.shared.bibliography http://schemas.openxmlformats.org/officeDocument/2006/bibliography
pyxb.bundles.ecma376.v2008.transitional.shared.commonSimpleTypes http://schemas.openxmlformats.org/officeDocument/2006/sharedTypes
pyxb.bundles.ecma376.v2008.transitional.shared.customXmlDataProperties http://schemas.openxmlformats.org/officeDocument/2006/customXml
pyxb.bundles.ecma376.v2008.transitional.shared.customXmlSchemaProperties http://schemas.openxmlformats.org/schemaLibrary/2006/main
pyxb.bundles.ecma376.v2008.transitional.shared.documentPropertiesCustom http://schemas.openxmlformats.org/officeDocument/2006/custom-properties
pyxb.bundles.ecma376.v2008.transitional.shared.documentPropertiesExtended http://schemas.openxmlformats.org/officeDocument/2006/extended-properties
pyxb.bundles.ecma376.v2008.transitional.shared.documentPropertiesVariantTypes http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes
pyxb.bundles.ecma376.v2008.transitional.shared.math http://schemas.openxmlformats.org/officeDocument/2006/math
pyxb.bundles.ecma376.v2008.transitional.shared.relationshipReference http://schemas.openxmlformats.org/officeDocument/2006/relationships
pyxb.bundles.ecma376.v2008.transitional.sml http://schemas.openxmlformats.org/spreadsheetml/2006/main
pyxb.bundles.ecma376.v2008.transitional.vml.main urn:schemas-microsoft-com:vml
pyxb.bundles.ecma376.v2008.transitional.vml.officeDrawing urn:schemas-microsoft-com:office:office
pyxb.bundles.ecma376.v2008.transitional.vml.presentationDrawing urn:schemas-microsoft-com:office:powerpoint
pyxb.bundles.ecma376.v2008.transitional.vml.spreadsheetDrawing urn:schemas-microsoft-com:office:excel
pyxb.bundles.ecma376.v2008.transitional.vml.wordprocessingDrawing urn:schemas-microsoft-com:office:word
pyxb.bundles.ecma376.v2008.transitional.wml http://schemas.openxmlformats.org/wordprocessingml/2006/main

OpenGIS

Note

As of PyXB 1.2.0, this bundle supports the version of the OGC Schema that use the W3C XLink 1.1 instead of the older OGC XLink schema. See http://www.opengeospatial.org/blog/1597 for more information about this change.

The following namespaces are available in support of Open Geospatial Consortium Geographic Information System processing. Note that several of these namespaces are “private” bindings generated because the OGC definitions include their own schema for use local to another schema. The modules corresponding to these namespace uses begin with an underscore, and should generally not be used in other contexts.

This bundle is not populated in the distributed versions of PyXB because it requires some 168MB of space to hold the schemas, generated bindings, and archive files. To build it, set PYXB_ROOT environment variable to the absolute path of the unpacked PyXB distribution (the directory containing setup.py) and run these commands:

cd ${PYXB_ROOT}
pyxb/bundles/opengis/scripts/genbind
python setup.py install

This will download the schemas from OGC, generate bindings for the namespaces below, and (re-)install PyXB including the new bindings. Other namespaces are available and can be added by modifying the genbind script and re-running the commands above.

Binding Module Namespace
pyxb.bundles.opengis._ogc http://www.opengis.net/ogc
pyxb.bundles.opengis._sam http://www.opengis.net/sampling/2.0
pyxb.bundles.opengis._sams http://www.opengis.net/samplingSpatial/2.0
pyxb.bundles.opengis.atom http://www.w3.org/2005/Atom
pyxb.bundles.opengis.citygml.appearance http://www.opengis.net/citygml/appearance/1.0
pyxb.bundles.opengis.citygml.base http://www.opengis.net/citygml/1.0
pyxb.bundles.opengis.citygml.building http://www.opengis.net/citygml/building/1.0
pyxb.bundles.opengis.citygml.cityFurniture http://www.opengis.net/citygml/cityfurniture/1.0
pyxb.bundles.opengis.citygml.cityObjectGroup http://www.opengis.net/citygml/cityobjectgroup/1.0
pyxb.bundles.opengis.citygml.generics http://www.opengis.net/citygml/generics/1.0
pyxb.bundles.opengis.citygml.landUse http://www.opengis.net/citygml/landuse/1.0
pyxb.bundles.opengis.citygml.relief http://www.opengis.net/citygml/relief/1.0
pyxb.bundles.opengis.citygml.texturedSurface http://www.opengis.net/citygml/texturedsurface/1.0
pyxb.bundles.opengis.citygml.transportation http://www.opengis.net/citygml/transportation/1.0
pyxb.bundles.opengis.citygml.vegetation http://www.opengis.net/citygml/vegetation/1.0
pyxb.bundles.opengis.citygml.waterBody http://www.opengis.net/citygml/waterbody/1.0
pyxb.bundles.opengis.csw_2_0_2 http://www.opengis.net/cat/csw/2.0.2
pyxb.bundles.opengis.csw_dc http://purl.org/dc/elements/1.1/
pyxb.bundles.opengis.csw_dct http://purl.org/dc/terms/
pyxb.bundles.opengis.fes_2_0 http://www.opengis.net/fes/2.0
pyxb.bundles.opengis.filter http://www.opengis.net/ogc
pyxb.bundles.opengis.gml_3_2 http://www.opengis.net/gml/3.2
pyxb.bundles.opengis.gml_3_3.ce http://www.opengis.net/gml/3.3/ce
pyxb.bundles.opengis.gml_3_3.exr http://www.opengis.net/gml/3.3/exr
pyxb.bundles.opengis.gml_3_3.lr http://www.opengis.net/gml/3.3/lr
pyxb.bundles.opengis.gml_3_3.lro http://www.opengis.net/gml/3.3/lro
pyxb.bundles.opengis.gml_3_3.lrov http://www.opengis.net/gml/3.3/lrov
pyxb.bundles.opengis.gml_3_3.lrtr http://www.opengis.net/gml/3.3/lrtr
pyxb.bundles.opengis.gml_3_3.rgrid http://www.opengis.net/gml/3.3/rgrid
pyxb.bundles.opengis.gml_3_3.tin http://www.opengis.net/gml/3.3/tin
pyxb.bundles.opengis.gml_3_3.xbt http://www.opengis.net/gml/3.3/xbt
pyxb.bundles.opengis.gml http://www.opengis.net/gml
pyxb.bundles.opengis.gmlsf http://www.opengis.net/gmlsf
pyxb.bundles.opengis.ic_ism_2_1 urn:us:gov:ic:ism:v2
pyxb.bundles.opengis.iso19139.v20070417.gco http://www.isotc211.org/2005/gco
pyxb.bundles.opengis.iso19139.v20070417.gmd http://www.isotc211.org/2005/gmd
pyxb.bundles.opengis.iso19139.v20070417.gmx http://www.isotc211.org/2005/gmx
pyxb.bundles.opengis.iso19139.v20070417.gsr http://www.isotc211.org/2005/gsr
pyxb.bundles.opengis.iso19139.v20070417.gss http://www.isotc211.org/2005/gss
pyxb.bundles.opengis.iso19139.v20070417.gts http://www.isotc211.org/2005/gts
pyxb.bundles.opengis.misc.xAL urn:oasis:names:tc:ciq:xsdschema:xAL:2.0
pyxb.bundles.opengis.ogckml22 http://www.opengis.net/kml/2.2
pyxb.bundles.opengis.om_1_0 http://www.opengis.net/om/1.0
pyxb.bundles.opengis.om_2_0 http://www.opengis.net/om/2.0
pyxb.bundles.opengis.oseo_1_0 http://www.opengis.net/oseo/1.0
pyxb.bundles.opengis.ows_1_1 http://www.opengis.net/ows/1.1
pyxb.bundles.opengis.ows_2_0 http://www.opengis.net/ows/2.0
pyxb.bundles.opengis.ows http://www.opengis.net/ows
pyxb.bundles.opengis.sampling_1_0 http://www.opengis.net/sampling/1.0
pyxb.bundles.opengis.sensorML_1_0_1 http://www.opengis.net/sensorML/1.0.1
pyxb.bundles.opengis.smil20 http://www.w3.org/2001/SMIL20/
pyxb.bundles.opengis.smil20lang http://www.w3.org/2001/SMIL20/Language
pyxb.bundles.opengis.sos_1_0 http://www.opengis.net/sos/1.0
pyxb.bundles.opengis.sos_2_0 http://www.opengis.net/sos/2.0
pyxb.bundles.opengis.swe_1_0_0 http://www.opengis.net/swe/1.0
pyxb.bundles.opengis.swe_1_0_1 http://www.opengis.net/swe/1.0.1
pyxb.bundles.opengis.swe_2_0 http://www.opengis.net/swe/2.0
pyxb.bundles.opengis.swes_2_0 http://www.opengis.net/swes/2.0
pyxb.bundles.opengis.tml http://www.opengis.net/tml
pyxb.bundles.opengis.waterml http://www.opengis.net/waterml/2.0
pyxb.bundles.opengis.wcs_1_1 http://www.opengis.net/wcs/1.1
pyxb.bundles.opengis.wfs http://www.opengis.net/wfs
pyxb.bundles.opengis.wps_1_0_0 http://www.opengis.net/wps/1.0.0

Layout of a Bundle Directory

The pyxb/bundles directory contains groups of bindings for related schema. These groups are called “bundles”, and each subdirectory represents a particular bundle.

With a bundle directory, the following are expected:

  • A scripts directory, containing an executable genbind which retrieves the schema and invokes pyxbgen to build the bindings
  • A schemas directory, into which the genbind script stores the schemas that were used to build the bindings
  • The Python module files for namespace modules. Normally these are customization wrappers
  • A raw subdirectory, into which the generated bindings are placed. This directory is normally removed and recreated as a consequence of running genbind; don’t expect anything in it to be persistent.
  • An examples directory, with programs that show how to use the capabilities in the bundle
  • A tests directory which validates customizations

Generating Bundled Bindings

To create the support infrastructure for a particular bundle, set the PYXB_ROOT environment variable to the root of an unpacked PyXB distribution and run the scripts/genbind script in the bundle root. For example:

cd ${PYXB_ROOT}
pyxb/bundles/wssplat/scripts/genbind

will invoke the wget(1) program to retrieve the XML schema for a variety of namespaces related to web services and then generate bindings and archive files for them.

Generating bundles should be a one-time action for each release of PyXB.

Note

Some servers, including http://www.w3.org, enforce an artificial delay in retrieving schema documents in order to encourage systems to use cached local copies. The genbind infrastructure will cache the schemas it downloads, but running the generation scripts for the common bundle, and possibly others, may result in errors if the caches are removed and the scripts run too frequently.

PyXB-1.2.6/doc/html/overview_what.html0000644000175000017500000001562413152762222017172 0ustar pabpab00000000000000 What Is PyXB? — PyXB 1.2.6 documentation

What Is PyXB?

PyXB is a pure Python package that generates Python code for classes that correspond to data structures defined by XMLSchema. In concept it is similar to JAXB for Java and CodeSynthesis XSD for C++.

The major goals of PyXB are:

  • Provide a generated Python interface that is “Pythonic”, meaning similar to one that would have been hand-written:
    • Attributes and elements are Python properties, with name conflicts resolved in favor of elements
    • Elements with maxOccurs larger than 1 are stored as Python lists
    • Bindings for type extensions inherit from the binding for the base type
    • Enumeration constraints are exposed as class (constant) variables
  • Support bi-directional conversion (document to Python and back)
  • Allow easy customization of the generated bindings to provide functionality along with content
  • Support all XMLSchema features that are in common use, including:
    • complex content models (nested all/choice/sequence)
    • cross-namespace dependencies
    • include and import directives
    • constraints on simple types
  • Validate the documents against their schema

Secondary goals, some of which have been achieved in the current release, are listed in PyXB Vision.

PyXB-1.2.6/doc/html/legal.html0000644000175000017500000001646013152762222015364 0ustar pabpab00000000000000 License and Disclaimers — PyXB 1.2.6 documentation

License and Disclaimers

License

PyXB as a whole is made available under the Apache License v 2.0. For full details see the LICENSE file in the distribution.

PyXB uses the six <https://pypi.python.org/pypi/six> module for Python 2/3 Compatible Source support.

About the Demonstration Web Services

There seem to be very few free public web services that are maintained and provide an interesting capability that does not require significant effort to demonstrate in an satisfactory way.

The Examples in the PyXB documentation refer to web services found through Google and other search engines. Some of these services are free; for others the API schemas could be obtained by anonymous download but use of the service would require a paid subscription.

These web services are used for demonstration purposes only. If you represent a company providing one of these services and object to its use in this way, email the developer to have the service references removed. If you provide interesting web services and would like to contribute to open source development and the promotion of web services by explicitly permitting this use, email the developer.

PyXB-1.2.6/doc/html/releases.html0000644000175000017500000022002613152762225016101 0ustar pabpab00000000000000 Release History — PyXB 1.2.6 documentation

Release History

Historically, the release number of PyXB indicated stability in a way similar to that of Linux several years ago, with even/odd of the middle digit indicating stability/development. That policy ended as of 1.1.3, and the relaxed policy is:

  • All releases consist of three non-negative integers
  • A release series refers to all releases with the same first two integers. The third integer indicates an incremental update to the system.
  • Should it be necessary to make wholesale changes that affect either stability or interface, the second or even first integer will be incremented
  • Critical bug fixes may result in new releases in older series, but this is expected to be extremely unusual. Such fixes will be made on a branch of the git repository.
  • All packaged releases are intended to be of comparable stability, with bug fixes and most enhancements causing an increment in the third integer

As examples, correcting the content model for weak determinism resulted in PyXB 1.2.0, and support of Python 3 was completed in PyXB 1.2.4. support for XML Schema 1.1 will not be addressed until PyXB 1.3.0 if at all.

1.2.x

The 1.2.x release series introduces a new content model which provides much more help in resolving validation errors. Concurrent with this support was dropped for Python 2.4 and 2.5. The 1.2.x release works with Python 2.6 and 2.7 and as of PyXB 1.2.4 also with Python 3.1 and later. Some unit tests are skipped under Python 2.6 due to insufficient support for validating exception attributes.

1.2.6 (04 Sep 2017)

This is a roll-up aggregating all fixes since the last major release one year ago. Release testing has been performed with Python 2.7.12, 3.4.7, 3.5.4, and 3.6.2.

Behavioral changes:

  • Overriding the DOM implementation via PYXB_XML_STYLE is deprecated. See issue 87.

The following reported defects/enhancements have been addressed:

  • Examples were not in the test suite. issue 61
  • Disallow setting an empty namespace prefix. issue 66
  • Support unicode identifiers under Python 3. issue 67
  • Do not use default value when constructing empty scalar values. issue 71
  • Defer validation when type is not yet available. issue 72
  • Correct validation of fixed values from XML. issue 73
  • Remove GPL code from PyXB. issue 77
  • Fix identification of restricted complex type. issue 78
  • Discard schema elements that cannot produce content. issue 79
  • Demonstrate use of overriding built-in bindings so XHTML model groups can be referenced. issue 81

1.2.5 (18 Sep 2016)

Documentation: http://pyxb.sourceforge.net/PyXB-1.2.5

This is a roll-up aggregating all fixes since the last major release nearly two years ago.

The following reported defects/enhancements have been addressed:

  • Deconflict class properties from module identifiers. issue 27
  • Correct handling of xsi:type on non-abstract types. issue 32
  • Fix generation of zero-span durations. issue 38
  • Document how to use file URIs on Windows. issue 34
  • Document need for common bindings when generating OpenGIS bindings. issue 28
  • Fix literal representation of not-a-number and infinite values. issue 43
  • Document that Python 3 is supported. issue 36
  • Fix processing of empty binary data tpyes. issue 51
  • Fix transition sort key to support Python 3. issue 52
  • Fix generation of modules that cannot be imported due to use of invalid characters in the module path. issue 48
  • Add a method to xsd.base64Binary to allow a heavy-weight validation step to be bypassed. issue 50

1.2.4 (19 Oct 2014)

Documentation: http://pyxb.sourceforge.net/PyXB-1.2.4

The major feature of this release is a new approach to Python 3 support based on the six module. This resolves support for Python 3 and allows one release of PyXB to support Python versions from 2.6 through 3.4, excluding 3.0. The maintainer/2to3 script used in PyXB 1.2.3 is no longer supported. Both the core implementation and the bindings are compatible with Python 2 and 3.

A second important feature was correct handling of QName by changing the binding representation from a string to an expanded name that saves the namespace URI rather than the prefix from the original document.

Finally, with this release primary development and support moves from SourceForge to Github. Inter-release updates will be made first on github (on the next branch), and pushed to the SourceForge git repository aperiodically.

Other miscellanous changes:

  • Correct rich comparisons for _PluralBinding instances. SF ticket 218
  • Prevent adding non-element content as wildcard elements. SF ticket 219
  • Provide public API to _CF_enumeration helper methods. SF ticket 221
  • Specify requirements for an acceptable DOM implementation. SF ticket 224
  • Rebase xs:decimal on Python decimal.Decimal to provide high precision support. SF ticket 91
  • Support Python 3. SF ticket 150
  • Fix mis-ordered attribute groups use/resolution issue. SF ticket 230
  • Generate facet values that are valid Python expressions. SF ticket 231
  • Improve validation failure location for simple values. SF ticket 232
  • Disallow name attribute in internal complex types. issue 6
  • Avoid unbounded non-deterministic expansion. issue 5
  • Reduce namespace intrusion with enumeration types. issue 9
  • Add API to replace simple content complex type values. issue 7
  • Fix representation and use of QNames. issue 13
  • Fix generation of wildcard attributes. issue 14
  • Fix validation of wildcard types in DOM instances. issue 15
  • Reference github for bug reports. issue 16:
  • Eliminate a gratuitous log warning on a validation failure. issue 17
  • Eliminate improper assertion on extension binding use of imported bindings. issue 18
  • Support serialization of anonymous namespaces to allow Python copy.deepcopy module to work on binding instances. issue 19
  • Generate bindings that are compatible with both Python 2 and Python 3. issue 22

1.2.3 (18 Sep 2013)

Documentation: http://pyxb.sourceforge.net/PyXB-1.2.3

This is primarily a bug-fix and clean-up release. One new feature is that starting with this release a Python 3 compatible version of PyXB will be available in the git repository. For this version, it may be obtained by:

git clone -b python3/pyxb-1.2.3 git://git.code.sf.net/p/pyxb/code pyxb3-1.2.3

The Python 3 code in this branch is created by automatic conversion of the Python 2 code using the maintainer/2to3 script. While not officially supported until PyXB 1.3.0, Python 3 appears to work correctly with this version.

Behavioral changes:

  • PyXB 1.2.1 automatically filled in the content of fixed elements. This generated invalid documents when the particular element should have been absent for some content. The feature has been removed so fixed elements initialize to absent just like every other element.
  • The former –pre-load-archives option to pyxbgen has been removed and replaced by –import-augmentable-namespace which has more consistent semantics. Schema import directives related to a non-augmentable namespace (one for which the referenced option has not been provided) will be ignored if content for the namespace can be located in any archive or builtin.
  • Generating DOM (or XML) expressions of bindings that were created by type constructors and not associated with elements now cause an exception to be raised rather than mis-using the type name as though it were a valid element tag.

Code cleanup:

  • Trailing whitespace throughout the source has been removed to decrease git complaints and non-reproducible patches.
  • Several coding practices that would not work under Python3 have been replaced with new solutions.

The following reported defects/enhancements have been addressed:

  • Fix DOM style handling of xsi:type attribute. SF ticket 166
  • Fix problems with nillable simple types. SF ticket 200
  • Fix problems inserting into plural element attributes. SF ticket 201
  • Correct namespace-qualified attributes. SF ticket 202
  • Eliminate automatic derivation of XML element tag from binding type when converting an element-free instance to DOM. SF ticket 203
  • Eliminate default to fixed value for elements. SF ticket 204
  • Re-word exception when element content was incompatible with fixed value. SF ticket 205
  • Fix the aslocal() method for xs:dateTime values with non-UTC timezones. SF ticket 206
  • Fix values for restricted duration ranges in pickled data such as namespace archives. SF ticket 207
  • Correct the interpretation of QName-valued base and similar attributes with respect to in-scope namespace declarations. SF ticket 208
  • Rework how to specify that imported namespaces should be processed to extend the content model. SF ticket 209
  • Removed redundant code in pyxbgen relevant to –wsdl-location. SF ticket 210
  • Refine diagnostics when an element with simple type appears in a context that expects non-element content. SF ticket 211
  • Add pyxb.NonElementContent to simplify access to non-element content in a mixed-content instance. SF ticket 212
  • Convert assert failures to diagnostic exceptions when generating DOM expressions of complex types with simple content where the content is missing. SF ticket 213
  • Ensure attribute values are converted from lexical space to value space when assigned from an XML representation. SF ticket 216

1.2.2 (17 Apr 2013)

Documentation: http://pyxb.sourceforge.net/PyXB-1.2.2

Almost all changes are bug fixes, including issues with element order when extending types, name conflicts between XML and Python entities in the binding, and unicode problems in diagnostics.

PyXB has never intentionally supported using bindings generated by different versions of PyXB. This will be enforced from version 1.2.2 onwards.

The following reported defects/enhancements have been addressed:

  • Correct management of changes to default namespace within documents. SF ticket 183
  • Do not interleave base and extension type elements. SF ticket 184
  • Incorrect character range management resulted in regex failure. SF ticket 186
  • Wide unicode mis-defines XML1p0e2 Char class. SF ticket 187
  • Improve contents of StructuralBadDocumentError. SF ticket 189
  • Generate exception details correctly with unicode content. SF ticket 190
  • Namespace must be a reserved symbol within CTD instances.
  • PyXB rejects restriction that changes element type. SF ticket 193
  • Multiple cases where names (from imported bindings, namespaces, and top-level classes and elements) resulted in conflicts with other top-level and class-level names. SF ticket 191, SF ticket 194, SF ticket 197
  • Avoid validating content of simple types marked with xsi:nil. SF ticket 195
  • Validate handling of attribute and element form attributes. SF ticket 196
  • Ensure all referenced namespaces are imported into a binding. SF ticket 198
  • Detect import of bindings generated by a different version of PyXB. SF ticket 199

1.2.1 (17 Dec 2012)

Documentation: http://pyxb.sourceforge.net/PyXB-1.2.1

Warning

This release has an interface change: the content method on complex types is now deprecated in favor of the orderedContent method. The members in the new list have wrapper classes to correctly associate instance bindings with the element declaration and to distinguish instances with string values from non-element character data. The old method is supported for this release, but will produce a warning when used, and is likely to be removed in the next release.

Key features of the release:

  • Full support for mixed content schema through a new method orderedContent on complex binding instances and flags that control when that list affects document generation. See Influencing Element and Mixed Content Order. This is particularly relevant to XHTML.
  • Immediate validation of values assigned to plural elements.
  • A first step to providing finer control of validation, using pyxb.ValidationConfig

The following reported defects/enhancements have been addressed:

1.2.0 (07 Nov 2012)

Documentation: http://pyxb.sourceforge.net/PyXB-1.2.0

This is a beta release intended to allow independent verification that the new content model works. It is released on SourceForge, but will not be made available through PyPI until such verification is satisfactory.

Key feature of the release:

  • Use of an advanced content model which provides more accurate validation and much better diagnostics when validation fails.
  • Elimination of support for Python 2.4 and 2.5 (necessary to ease the path to a future Python3 implementation of PyXB).
  • Complete rework of the exceptions that normally arise when using binding instances. These exceptions now provide information through attributes rather than a text message.

The following reported defects/enhancements have been addressed:

  • Improved diagnostics. SF ticket 26, SF ticket 75
  • Correct handling of schema where greedy processing fails. SF ticket 112, SF ticket 133
  • Elements and attributes in generated bindings are emitted in a deterministic order sorted by schema and location within schema, to ensure deterministic processing and reduce variation between bindings when generation is repeated. SF ticket 164
  • Make documentation annotations from schema available as documentation strings for the generated complex type bindings. SF ticket 79
  • Update OpenGIS bindings to use W3C XLink schema. SF ticket 165

1.1.x

The 1.1.x release series entered maintenance mode with release 1.1.5. It is unlikely that further releases will occur, though critical bugs fixes may be made available in the release branch. Bugs reported against 1.1.5 will generally be fixed in the 1.2.x series.

1.1.5 (01 Nov 2012)

Documentation: http://pyxb.sourceforge.net/PyXB-1.1.5

This is a maintenance release to finalize the 1.1.x series before starting the 1.2.x series.

The following reported defects/enhancements have been addressed:

1.1.4 (15 Jun 2012)

Documentation: http://pyxb.sourceforge.net/PyXB-1.1.4

Key features of the release:

  • A large number of bug fixes, especially in the area of internationalization. Naive uses of unicode have mostly been eliminated.
  • Corrections and improvements to date and time-related types, especially with respect to timezones.
  • More namespaces have been added in the common, WS-*, and OpenGIS bundles.
  • This release eliminates the separate packages for different bundles; all bundles and documentation except for OpenGIS are incorporated into the release file. OpenGIS is present but must be built manually; see OpenGIS

Examples have been added:

  • examples/customization shows advanced customization, including injecting behavior into binding classes corresponding to types from which other XML types are extended or restricted. It also demonstrates how to introspect the bindings within a module, automating much of the process of extending multiple bindings with the same functionality.
  • examples/unicode_jp demonstrates internationalization features including the ability to intercept PyXB’s construction of Python identifiers from XML identifiers to produce meaningful identifiers when the schema language is not compatible with the Python 2 requirement that identifiers be ASCII.

The following reported defects/enhancements have been addressed:

1.1.3 (09 Sep 2011)

Documentation: http://pyxb.sourceforge.net/PyXB-1.1.3

General cleanup, finish up a few previously unsupported datatypes.

1.1.2 (30 May 2010)

Documentation: http://pyxb.sourceforge.net/PyXB-1.1.2

Complete replacement of the model group portion of the content model. The NFA-to-DFA approach is gone. The resulting system does a better job in less space and significantly faster: 30% faster on the standard tmsxtvd test, orders of magnitude on documents with large sequences of optional elements.

Note: A couple unit tests fail due to incidental reasons that will be addressed when fixing SF ticket 75. Also, the architecture documentation for the validation portion of the content model is completely out of date.

  • Handle sequences of optional elements more effectively. SF ticket 33
  • Correct multi-step attribute restriction/extension. SF ticket 80
  • Support prefix rewrite for schema location URIs. SF ticket 81
  • Fix syntax error generating wildcard namespace constraints. SF ticket 84
  • Support whitespace validation bypass in simple type definitions. SF ticket 85

1.1.1 (28 Jan 2010, rev 2135)

Documentation: http://pyxb.sourceforge.net/PyXB-1.1.1

Major feature is significantly improved ability to determine what content is not acceptable to the validating parser, and where it can be found in the document. See Locating Invalid Content.

Also, using keyword parameters in binding instance constructors will now raise an pyxb.exceptions_.ExtraContentError in the case where the keyword does not correspond to the PyXB-generated identifier associated with an attribute or element of the class being instantiated.

  • Eliminate complaints about reference to deprecated sha module in Python 2.6.
  • Fix assorted problems with mixtures of –binding-root, –module-prefix, and –write-for-customization. SF ticket 64, SF ticket 65
  • Eliminate unnecessary attempts to download schema for builtin namespaces. SF ticket 63
  • Avoid assertion failure when provided schema location’s content looks a little, but not enough, like a schema document. SF ticket 72
  • References to declarations in other namespaces are now calculated locally to the module, rather than cached under the expectation the name is valid everywhere. SF ticket 73
  • Imposed consistency on behavior when document root element is not recognized. SF ticket 74
  • Partial implementation of improved error data stored in exceptions. SF ticket 75
  • Detect invalid keywords in instance constructor calls. SF ticket 76

1.1.0 (30 Nov 2009, rev 2092)

Mostly nit-picky things, but some changed interface, so we’re starting a new beta series.

  • Make handling of invalid xsi:type attributes more robust. SF ticket 56
  • Use validation flags to control validation (what a novel concept). SF ticket 57
  • Fix improper generation of content within elements marked as xsi:nil. SF ticket 58
  • Provide mechanism to control default handling of xsi:type attributes in instance documents. SF ticket 60
  • Fix bug where constraining facets were not inherited when deriving simple types by restriction. SF ticket 61

1.0.x (Stable)

1.0.0 (18 Oct 2009, rev 2068)

Nobody seems to have found anything critical for a while, and it does what I want it to, so we’ll let this thing run free.

  • Replace a reference to a non-existent variable with something that works. SF ticket 52
  • Consistently validate instances created from documents no matter which parser is used. SF ticket 53
  • Support caching message references in WSDL SOAP faults. SF ticket 54

0.7.x (Beta)

0.7.3 (15 Sep 2009, rev 2050)

A few bug fixes (one major), a couple new features, and separation of the various components to allow a smaller distribution.

  • Fixed a circular reference in the DFA state classes that caused memory bloat in long-running processes. SF ticket 49

  • When PyXB renames an XML element or attribute due to a collision with a reserved word, it will write a warning, and at runtime will raise an exception if an attempt is made to assign to the original name. SF ticket 50, SF ticket 51

  • Support for pattern restrictions for string-based simple types. SF ticket 47

  • Split distribution into multiple files to reduce download size:

    • PyXB-base-@VERSION@.tar.gz – Complete release, nothing pre-built
    • PyXB-doc-@VERSION@.tar.gz – Overlay with pre-built documentation
    • PyXB-common-@VERSION@.tar.gz – Overlay with XHTML bindings
    • PyXB-opengis-@VERSION@.tar.gz – Overlay with OpenGIS bindings
    • PyXB-wsspat-@VERSION@.tar.gz – Overlay with WS-* bindings
    • PyXB-full-@VERSION@.tar.gz – Complete release with all overlays

0.7.2 (25 Aug 2009, rev 1981)

Primarily to fix a problem with chameleon schemas, but also a couple other minor issues.

  • References to QNames with absent namespaces in chameleon schema included into schema with a target namespace could not be resolved. SF ticket 46
  • Documentation content was not correctly sanitized for use within a Python docstring. SF ticket 45.
  • Elements with complex types with simple content that derived from string could not be marked as nil. SF ticket 48

0.7.1 (23 Aug 2009, rev 1968)

None of the enhancements really got in, but lots of minor bug fixes.

  • Restored the ability to dump copies of all schemas retrieved from a remote location, so you can review them. SF ticket 28
  • Fixed assorted problems with simple types constructed by list and union. SF ticket 35, SF ticket 40
  • Provide link from content values to the element binding that was used to store them. Useful for quickly identifying the owner element when generating a valid child sequence for conversion to DOM. SF ticket 36
  • Fix validation of attributes with union types. SF ticket 37
  • Enumeration fixes: Only generate class-level constants for enumerations that restrict a string representation (not double, float, etc). Verify enumerations work correctly on list and union constructions. Duplicate the class-level constants for enumerations that are defined in union member types. SF ticket 38
  • Provide a facility to simplify the automatic creation of an instance of the appropriate type when storing values into an element. Makes life with anonymous local elements a lot easier. SF ticket 39
  • Enhance management of namespace prefixes by allowing a system-wide default in BindingDOMSupport and by inferring the base name of the module as the default prefix for namespaces defined in imported bindings. SF ticket 41
  • Provided crude facility to bypass validation when generating and parsing documents. SF ticket 44
  • Re-arrange the help for pyxbgen’s arguments, and add a script to automatically generate the Sphinx tables for it.
  • Support bundles of related schemas/namespaces, currently wssplat (for WS-*) and opengis (Geographic Information Systems).
  • Got the user-level documentation back up to where it might actually help somebody.

0.7.0 (03 Aug 2009, rev 1715)

This release is identical to 0.5.2 except that the binding interface has completely changed. All examples have been updated; the documentation will be updated later.

Note that the code in PyXB itself has not changed, and is not going to change. However, properties produce an interface more natural to most Python programs, so that has become the default style. See the –binding-style parameter to pyxbgen if you want to change this.

  • Change the method of accessing elements and attributes in bindings from accessor methods (e.g., elt.attr(), elt.setAttr()) to properties (e.g., elt.attr). SF ticket 18

0.5.x (Beta)

0.5.2 (03 Aug 2009, rev 1706)

Mostly changes to namespaces in support of profiles and application schemas which extend other namespaces with special components, or have their own copies of somebody else’s schemas, etc. See the pyxbgen private/public namespace switches.

  • Presence of nested choice model groups caused the plurality calculations to be wrong: some elements were dropped from the model, others were treated as lists when only one instance would be permitted. SF ticket 34
  • Content accessor would return wrong value for elements with simple type of list variety. SF ticket 32
  • Corrected handling of attributes when deriving complex types by restriction. SF ticket 27
  • Added a source module for XML namespace (http://www.w3.org/XML/1998/namespace) with bindings linked to the built-in component model. SF ticket 23
  • Fix inadequacies in namespace archive management. SF ticket 22

This is expected to be the last release in 0.5.x. 0.7.0 should follow soon thereafter, and only contain the change of default binding style from accessor to property. SF ticket 18

0.5.1 (16 Jul 2009, rev 1502)

Fixed various problems with OpenGIS schemas, specifically dependency loops induced by attempting to keep binding components within modules identified by the schema they came from, and loss of bindings for one namespace due to its being overwritten by those for another.

  • The presence of a wildcard in a sequence or choice model group caused other elements to be lost in the binding. SF ticket 29
  • Rework content verification to operate on binding instances rather than DOM nodes. SF ticket 24
  • Use value() to extract the value of a complex type with simple content; the content() method works only with element and mixed content. SF ticket 21
  • Add support to specify prefix to be used in QNames when generating DOM documents from binding instances. Provide facility to re-use the BindingDOMSupport instance for multiple conversions. SF ticket 15
  • Tightened requirements on content type matching: no more will strings and numbers automatically be converted to match the content model (probably for a branch you didn’t intend). SF ticket 14
  • Fix problems overwriting binding modules with data from a different set of namespaces. SF ticket 31.
  • Eliminated the schema group modules: too hard to avoid dependency loops. Now all components are written into a single module, which is a namespace group module if the components cross namespaces. A namespace-specific module still exists, and imports only the relevant components from the group module.

0.5.0 (07 Jul 2009, rev 1446)

Ability to parse many of the OpenGIS schemas (gml, iso19139, citygml, ogc, ogckml22, om, ows, sensorML, sos, swe, tml, ...).

  • Completely rework include and import directives to correctly handle relative paths in schemaLocation attributes and to only import from a given location once per namespace. SF ticket 9, SF ticket 8, SF ticket 5
  • Parse final attribute on type definitions (though this has no effect on the bindings). SF ticket 10
  • Complete missing implementations in complex types with simple content. SF ticket 6
  • Create new code generation model which supports inter-namespace and inter-schema dependency cycles. Namespace archives can now holds all namespaces that depend on each other.
  • Other miscellaneous. SF ticket 11
  • Did I mention the ability to handle OpenGIS? SF ticket 16

Beware:

  • Most of the classes in the new code generation model are undocumented.
  • The interface to pyxbgen has changed completely. Look at examples/OpenGIS/makebind.sh or other scripts in the examples directory.

0.4.x (Stable)

0.4.0 (20 Jun 2009, rev 1204)

First usable public release.

  • Use expanded names for all declarations and definitions. SF ticket 1
  • Use the finite automaton content model for generation as well as parsing. SF ticket 2
  • Support xsi:type and xsi:nil. SF ticket 3
  • Support substitution groups. SF ticket 4
  • Fix many problems in QName resolution
  • Implement the remaining date/time types
  • Rework content model so binding instances are always instances of the binding for the corresponding XML type, with no intervening element instance
  • Add support for SAX parser

0.2.x (Stable)

0.2.0 (30 May 2009, rev 818)

  • Initial public release
PyXB-1.2.6/doc/html/examples.html0000644000175000017500000015351113152762222016115 0ustar pabpab00000000000000 Examples — PyXB 1.2.6 documentation

Examples

A detailed, albeit contrived, example of how to use PyXB is in Generating Binding Classes.

Multiple real-world XML and web service examples of varying complexity are provided in the examples subdirectories of the PyXB distribution and of the various bundles. Some are WSDL services, and others are simply XMLSchema documents. Often there are a couple trivial programs that show how the bindings are used. The script test.sh in each directory can be used to generate the bindings and run the programs in a single step.

See the README.txt file in each example subdirectory for more information.

For ...

You may also want to look at some of the unit tests for other ideas.

Dictionary (Aonaware)

The Dictionary web service at Aonaware.

The example define.py looks up a word in all available dictionaries:

from __future__ import print_function
import dict
from pyxb.utils.six.moves.urllib.request import urlopen
import sys
from pyxb.utils import domutils

word = 'xml'
if 1 < len(sys.argv):
    word = sys.argv[1]

# Create a REST-style query to retrieve the information about this dictionary.
uri = 'http://services.aonaware.com/DictService/DictService.asmx/Define?word=%s' % (word,)
rxml = urlopen(uri).read()
resp = dict.CreateFromDOM(domutils.StringToDOM(rxml))

print('Definitions of %s:' % (resp.Word,))
for definition in resp.Definitions.Definition:
    print('From %s (%s):' % (definition.Dictionary.Name, definition.Dictionary.Id))
    print(definition.WordDefinition)
    print()

The example showdict.py lists the available dictionaries:

# -*- coding: utf-8 -*-

from __future__ import print_function
import sys
import dict
from pyxb.utils.six.moves.urllib.request import urlopen
import pyxb.utils.domutils as domutils
from xml.dom import minidom

# Get the list of dictionaries available from the service.
port_uri = 'http://services.aonaware.com/DictService/DictService.asmx'
uri = port_uri + '/DictionaryList'
dle_xml = urlopen(uri).read()
dle_dom = domutils.StringToDOM(dle_xml)
dle = dict.ArrayOfDictionary.createFromDOM(dle_dom)

op_path = '/DictionaryInfo'
for d in dle.Dictionary:
    # Create a REST-style query to retrieve the information about this dictionary.
    uri = '%s%s?dictId=%s' % (port_uri, op_path, d.Id)
    resp = urlopen(uri).read()
    print("%s (%s) : %d chars" % (d.Name, d.Id, len(resp)));

    # The response is a simple type derived from string, so we can
    # just extract and print it.  Excluded by default since it has
    # leading and trailing whitespace that causes problems with using
    # git to store the expected output.
    di_resp = dict.CreateFromDOM(domutils.StringToDOM(resp))
    if sys.stdout.isatty():
        print("%s\n" % di_resp);

Sorry, no automatic generation of classes corresponding to the WSDL operations. Next release, maybe.

Simple Weather (CDyne)

A free weather service. The REST interface was demonstrated as the Thirty Second Example. A SOAP interface example is in client.py:

from __future__ import print_function
import sys
import time
from pyxb.utils.six.moves.urllib import request as urllib_request
import pyxb.bundles.wssplat.soap11 as soapenv
import weather

zip = 55113
if 1 < len(sys.argv):
    zip = int(sys.argv[1])

# Create an envelope, and give it a body that is the request for the
# service we want.
env = soapenv.Envelope(soapenv.Body(weather.GetCityForecastByZIP(ZIP=str(zip))))
open('request.xml', 'w').write(env.toxml("utf-8"))

# Invoke the service
uri = urllib_request.Request('http://wsf.cdyne.com/WeatherWS/Weather.asmx',
                             env.toxml("utf-8"),
                             { 'SOAPAction' : "http://ws.cdyne.com/WeatherWS/GetCityForecastByZIP", 'Content-Type': 'text/xml' } )
rxml = urllib_request.urlopen(uri).read()
open('response.xml', 'w').write(rxml)

# Convert the response to a SOAP envelope, then extract the actual
# response from the wildcard elements of the body.  Note that because
# the weather namespace was registered, PyXB already created the
# binding for the response.
soap_resp = soapenv.CreateFromDocument(rxml)
resp = soap_resp.Body.wildcardElements()[0]

fc_return = resp.GetCityForecastByZIPResult
if fc_return.Success:
    print('Got response for %s, %s:' % (fc_return.City, fc_return.State))
    for fc in fc_return.ForecastResult.Forecast:
        when = time.strftime('%A, %B %d %Y', fc.Date.timetuple())
        outlook = fc.Desciption # typos in WSDL left unchanged
        low = fc.Temperatures.MorningLow
        high = fc.Temperatures.DaytimeHigh
        print('  %s: %s, from %s to %s' % (when, outlook, low, high))

Note the various misspellings in the schema (e.g., “Desciption”). Also, be aware that the weather information in this service does not get updated often, and sometimes fails to provide valid dates. Try various zip codes; usually you can find one that works.

Professional Weather (National Digital Forecast Data)

Interact with the National Digital Forecast Database.

Use the genbindings.sh script to retrieve the schema for Digital Weather Markup Language and generate the bindings. Note that the schema has two levels of include directives, which PyXB follows.

The examples for this service are too long to include into the web documentation. forecast.py uses the REST interface to get the forecast temperature data for two locations, and print it in several ways. latlon.py does something similar but for a latitude/longitude pair, using SOAP, and requesting more data.

Television Schedules (Tribune Media Services)

A commercial service for television listings. Only one sample document is available for testing; it is retrieved using genbindings.sh. The dumpsample.py demonstrates extending a binding to add a custom method, and parsing content with both DOM and SAX. It also provides timing information; the document is about 200KB, and takes several seconds to parse.

from __future__ import print_function
import io
import time
import xml.dom.minidom
import pyxb.utils.saxdom
import pyxb.binding.saxer
import tmstvd
#import cProfile

# Extend the anonymous class used by the xtvd element to add a method
# we can use to test equality of two instances.  Normally, you'd just
# refer to the complex type binding class itself, but we don't know
# what PyXB named it.
class my_xtvd (tmstvd.xtvd.typeDefinition()):
    def equal (self, other, verbose=False):
        if len(self.stations.station) != len(other.stations.station):
            return False
        for i in range(len(self.stations.station)):
            s = self.stations.station[i]
            o = other.stations.station[i]
            if (s.callSign != o.callSign) or (s.name != o.name) or (s.id != o.id):
                return False
            if verbose:
                print('Match station %s is %s, id %d' % (s.callSign, s.name, s.id))
        return True
tmstvd.xtvd.typeDefinition()._SetSupersedingClass(my_xtvd)

# The sample document.
xml_file = 'tmsdatadirect_sample.xml'

print('Generating binding from %s with minidom' % (xml_file,))
mt1 = time.time()
xmld = open(xml_file, 'rb').read()
mt2 = time.time()
dom = xml.dom.minidom.parse(io.BytesIO(xmld))
mt3 = time.time()
#cProfile.run('tmstvd.CreateFromDOM(dom.documentElement)', 'dom.prf')
dom_instance = tmstvd.CreateFromDOM(dom.documentElement)
print('minidom first callSign at %s' %(dom_instance.stations.station[0].callSign._location(),))
mt4 = time.time()

print('Generating binding from %s with SAXDOM' % (xml_file,))
dt1 = time.time()
dom = pyxb.utils.saxdom.parse(io.BytesIO(xmld), location_base=xml_file)
dt2 = time.time()
#cProfile.run('tmstvd.CreateFromDOM(dom.documentElement)', 'saxdom.prf')
saxdom_instance = tmstvd.CreateFromDOM(dom.documentElement)
print('SAXDOM first callSign at %s' % (saxdom_instance.stations.station[0].callSign._location(),))
dt3 = time.time()

print('Generating binding from %s with SAX' % (xml_file,))
st1 = time.time()
saxer = pyxb.binding.saxer.make_parser(location_base=xml_file)
handler = saxer.getContentHandler()
st2 = time.time()
saxer.parse(io.BytesIO(xmld))
#cProfile.run('saxer.parse(open(xml_file))', 'sax.prf')
st3 = time.time()
sax_instance = handler.rootObject()
print('SAXER first callSign at %s' % (sax_instance.stations.station[0].callSign._location(),))

print('DOM-based read %f, parse %f, bind %f, total %f' % (mt2-mt1, mt3-mt2, mt4-mt3, mt4-mt2))
print('SAXDOM-based parse %f, bind %f, total %f' % (dt2-dt1, dt3-dt2, dt3-dt1))
print('SAX-based read %f, parse and bind %f, total %f' % (st2-st1, st3-st2, st3-st1))
print("Equality test on DOM vs SAX: %s" % (dom_instance.equal(sax_instance),))
print("Equality test on SAXDOM vs SAX: %s" % (saxdom_instance.equal(sax_instance, verbose=True),))

Address-To-Latitude/Longitude (http://geocoder.us)

This service provides the latitude and longitude for free-form US addresses. It also demonstrates several of the pitfalls of using WSDL, which has a very lax concept of schemas, with a system that expects to operate on validatable documents. The following changes were made to make the service easier to work with:

  • Change the element form default to qualified. This is necessary because there is a non-absent target namespace in the schema, and the documents returned from the service set it as the default namespace. This causes the XML engine to associate that namespace with locally-scoped elements like “number”, while the original unqualified form default caused the schema to record them with no namespace.
  • Set minOccurs on all the elements, since some are missing from some responses
  • Set nillable on all elements that are observed to use xsi:nil="true" in response documents
  • Provide types and elements corresponding to the request and response messages, since PyXB’s WSDL support does not currently generate them from the operation messages.

genbindings.sh applies changes to the WSDL after retrieving it and prior to generating the bindings.

A second complication is the need to burrow down through wildcard elements in the binding instance generated from the SOAP response. This is the consequence of an error in the WSDL specification, which was discovered after too many tools had already worked around it. Currently, PyXB also requires that you work around it manually, although a customization of the relevant SOAP encoding class could make it unnecessary.

from __future__ import print_function
import sys
from pyxb.utils.six.moves.urllib import request as urllib_request
import GeoCoder
from pyxb import BIND
from pyxb.utils import domutils
import pyxb.bundles.wssplat.soap11 as soapenv
import pyxb.bundles.wssplat.soapenc as soapenc

address = '1600 Pennsylvania Ave., Washington, DC'
if 1 < len(sys.argv):
    address = sys.argv[1]

env = soapenv.Envelope(Body=BIND(GeoCoder.geocode(address)))

uri = urllib_request.Request('http://rpc.geocoder.us/service/soap/',
                      env.toxml("utf-8"),
                      { 'SOAPAction' : "http://rpc.geocoder.us/Geo/Coder/US#geocode", 'Content-Type': 'text/xml' } )

rxml = urllib_request.urlopen(uri).read()
#open('response.xml', 'w').write(rxml)
#rxml = open('response.xml').read()
response = soapenv.CreateFromDocument(rxml)

# OK, here we get into ugliness due to WSDL's concept of schema in the
# SOAP encoding not being consistent with XML Schema, even though it
# uses the same namespace.  See
# http://tech.groups.yahoo.com/group/soapbuilders/message/5879.  In
# short, the WSDL spec shows an example using soapenc:Array where a
# restriction was used to set the value of the wsdl:arrayType
# attribute.  This restriction failed to duplicate the element content
# of the base type, resulting in a content type of empty in the
# restricted type.  Consequently, PyXB can't get the information out
# of the DOM node, and we have to skip over the wildcard items to find
# something we can deal with.

# As further evidence the folks who designed SOAP 1.1 didn't know what
# they were doing, the encodingStyle attribute that's supposed to go
# in the Envelope can't validly be present there, since it's not
# listed and it's not in the namespace admitted by the attribute
# wildcard.  Fortunately, PyXB doesn't currently validate wildcards.

encoding_style = response.wildcardAttributeMap().get(soapenv.Namespace.createExpandedName('encodingStyle'))
items = []
if encoding_style == soapenc.Namespace.uri():
    gcr = response.Body.wildcardElements()[0]
    soap_array = gcr.wildcardElements()[0]
    items = soap_array.wildcardElements()
else:
    pass

for item in items:
    if (item.lat is None) or item.lat._isNil():
        print('Warning: Address did not resolve')
    print('''
%s %s %s %s %s
%s, %s  %s
%s %s''' % (item.number, item.prefix, item.street, item.type, item.suffix,
            item.city, item.state, item.zip,
            item.lat, item.long))

OpenGIS (http://www.opengeospatial.org)

See the directory examples/OpenGIS in the distribution.

PyXB-1.2.6/doc/html/userref_validating.html0000644000175000017500000003317213152762225020157 0ustar pabpab00000000000000 Debugging Validation Errors — PyXB 1.2.6 documentation

Debugging Validation Errors

Note

This material should be expanded in a future release when trac/171 is addressed.

In the 1.1.x release series of PyXB a common and valid complaint was that PyXB would validate documents and binding instances, but did not provide useful information explaining why a particular document was invalid. The content validation approach described in Validating the Content Model allows the application to diagnose:

  • the element or instance data that failed to satisfy the content model;
  • the location of that element within a document being parsed;
  • the point in the XML schema where the containing complex type was defined;
  • the content that was expected to have been encountered.

Perhaps the quickest way to see the information PyXB now provides is to look at the Professional Weather (National Digital Forecast Data) example, and in particular the latlon.py script. This script uses WSDL to obtain the near-term forecast for a location within the United States using latitude and longitude.

In the course of validating PyXB 1.2.0, it was discovered that the National Weather Service has added some new elements to their schema, with the result that the servers no longer provide valid XML: in particular, order constraints on individual forecast characteristics are violated. This caused the example to fail.

While the script needs to be cleaned up considerably, the following code block shows how the retrieved XML document is converted into a binding instance:

# Create the binding instance from the response.  If there's a
# problem, diagnose the issue, then try again with validation
# disabled.
r = None
try:
    r = DWML.CreateFromDocument(rxml)
except pyxb.UnrecognizedContentError as e:
    print '*** ERROR validating response:'
    print e.details()
if r is None:
    pyxb.RequireValidWhenParsing(False)
    r = DWML.CreateFromDocument(rxml)

When invoking the program, the following diagnostic output is provided through the details method:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
*** ERROR validating response:
The containing element parameters is defined at ndfd_data.xsd[29:12].
The containing element type parametersType is defined at parameters.xsd[21:4]
The unrecognized content probability-of-precipitation begins at <unknown>[217:6]
The parametersType automaton is in an accepting state.
The following element and wildcard content would be accepted:
     An element cloud-amount per parameters.xsd[379:12]
     An element humidity per parameters.xsd[416:12]
     An element weather per parameters.xsd[449:12]
     An element conditions-icon per parameters.xsd[566:12]
     An element hazards per parameters.xsd[585:12]
     An element wordedForecast per parameters.xsd[701:11]
     An element pressure per parameters.xsd[715:12]
     An element probabilisticCondition per parameters.xsd[751:12]
     An element water-state per parameters.xsd[785:12]

This tells the user that:

  1. A problem was encountered processing an element parameters from an element declaration found in the ndfd_data.xsd schema starting at column 12 on line 29.
  2. The parameters element is of type parametersType, and its content model can be found in the complex type definition in the parameters.xsd schema starting on line 21.
  3. The error in the document was failure to recognize an element probability-of-precipitation which was found at line 217 of the input. (The document is being parsed from a Python string, so no URI is available).
  4. Had the containing parameters element ended before this point, the element would be valid.
  5. The names and definition locations of element data that would have been acceptable at that point follow in lines 7 through 15.

A much shorter but still useful synopsis of the invalidity would be available through the str operation on the exception. Full details are available through attributes on the UnrecognizedContentError and other exceptions.

In cases where the service generating the documents is under your control, you can use this information to correct the documents. In cases like this where the error is in a production server, the proper approach is to report the error, disable validation, and move on with ones life.

Runtime Exception Hierarchy

Details on the interfaces presented by these exceptions can be found through the API Documentation.

_images/RuntimeExceptions.jpg _images/CTDValidationExceptions.jpg
PyXB-1.2.6/doc/html/userref_pyxbgen.html0000644000175000017500000013713413152762225017514 0ustar pabpab00000000000000 Generating Binding Classes — PyXB 1.2.6 documentation

Generating Binding Classes

The following sections reference example schema and programs that are available in the examples/manual subdirectory of the PyXB distribution.

Note

PyXB is developed and tested assuming a POSIX file system, as is used on Linux. While PyXB works perfectly well on Windows, some accommodation is required. In particular, when providing file URIs as command-line arguments to pyxbgen it may be necessary to explicitly note that the parameter is a URI by using the Windows file URI form of the file path.

For example, something like this will generally not work:

pyxbgen -m x -u "c:\\Windows\My Documents\x.xsd" # DO NOT USE

This should be expressed as:

pyxbgen -m x -u file://c:/Windows/My%20Documents/x.xsd

Self-contained schema

The following schema po1.xsd is a condensed version of the purchase order schema in the XMLSchema Primer:

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsd:element name="purchaseOrder" type="PurchaseOrderType"/>
  <xsd:element name="comment" type="xsd:string"/>
  <xsd:complexType name="PurchaseOrderType">
    <xsd:sequence>
      <xsd:element name="shipTo" type="USAddress"/>
      <xsd:element name="billTo" type="USAddress"/>
      <xsd:element ref="comment" minOccurs="0"/>
      <xsd:element name="items"  type="Items"/>
    </xsd:sequence>
    <xsd:attribute name="orderDate" type="xsd:date"/>
  </xsd:complexType>
  <xsd:complexType name="USAddress">
    <xsd:sequence>
      <xsd:element name="name"   type="xsd:string"/>
      <xsd:element name="street" type="xsd:string"/>
      <xsd:element name="city"   type="xsd:string"/>
      <xsd:element name="state"  type="xsd:string"/>
      <xsd:element name="zip"    type="xsd:decimal"/>
    </xsd:sequence>
    <xsd:attribute name="country" type="xsd:NMTOKEN" fixed="US"/>
  </xsd:complexType>
  <xsd:complexType name="Items">
    <xsd:sequence>
      <xsd:element name="item" minOccurs="0" maxOccurs="unbounded">
        <xsd:complexType>
          <xsd:sequence>
            <xsd:element name="productName" type="xsd:string"/>
            <xsd:element name="quantity">
              <xsd:simpleType>
                <xsd:restriction base="xsd:positiveInteger">
                  <xsd:maxExclusive value="100"/>
                </xsd:restriction>
              </xsd:simpleType>
            </xsd:element>
            <xsd:element name="USPrice"  type="xsd:decimal"/>
            <xsd:element ref="comment"   minOccurs="0"/>
            <xsd:element name="shipDate" type="xsd:date" minOccurs="0"/>
          </xsd:sequence>
          <xsd:attribute name="partNum" type="SKU" use="required"/>
        </xsd:complexType>
      </xsd:element>
    </xsd:sequence>
  </xsd:complexType>
  <!-- Stock Keeping Unit, a code for identifying products -->
  <xsd:simpleType name="SKU">
    <xsd:restriction base="xsd:string">
      <xsd:pattern value="\d{3}-[A-Z]{2}"/>
    </xsd:restriction>
  </xsd:simpleType>

</xsd:schema>

Translate this into Python with the following command:

pyxbgen \
  -u po1.xsd  -m po1

The -u parameter identifies a schema document describing contents of a namespace. The parameter may be a path to a file on the local system, or a URL to a network-accessible location like http://www.weather.gov/forecasts/xml/DWMLgen/schema/DWML.xsd. The -m parameter specifies the name to be used by the Python module holding the bindings generated for the namespace in the preceding schema. After running this, the Python bindings will be in a file named po1.py.

With the bindings available, this program (demo1.py):

from __future__ import print_function
import po1

xml = open('po1.xml').read()
order = po1.CreateFromDocument(xml)

print('%s is sending %s %d thing(s):' % (order.billTo.name, order.shipTo.name, len(order.items.item)))
for item in order.items.item:
    print('  Quantity %d of %s at $%s' % (item.quantity, item.productName, item.USPrice))

processing this document:

<?xml version="1.0"?>
<purchaseOrder orderDate="1999-10-20">
  <shipTo country="US">
    <name>Alice Smith</name>
    <street>123 Maple Street</street>
    <city>Anytown</city><state>AK</state><zip>12341</zip>
  </shipTo>
  <billTo country="US">
    <name>Robert Smith</name>
    <street>8 Oak Avenue</street>
    <city>Anytown</city><state>AK</state><zip>12341</zip>
  </billTo>
  <items>
    <item partNum="833-AA">
      <productName>Lapis necklace</productName>
      <quantity>1</quantity>
      <USPrice>99.95</USPrice>
      <comment>Want this for the holidays!</comment>
      <shipDate>1999-12-05</shipDate>
    </item>
    <item partNum="833-AB">
      <productName>Plastic necklace</productName>
      <quantity>4</quantity>
      <USPrice>3.95</USPrice>
      <shipDate>1999-12-24</shipDate>
    </item>
  </items>
</purchaseOrder>

produces the following output:

Robert Smith is sending Alice Smith 2 thing(s):
  Quantity 1 of Lapis necklace at $99.95
  Quantity 4 of Plastic necklace at $3.95

Multi-document schema

Complex schema are more easy to manage when they are separated into multiple documents, each of which contains a cohesive set of types. In the example above, the USAddress type can be abstracted to handle a variety of addresses, and maintained as its own document address.xsd:

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsd:complexType name="Address">
    <xsd:sequence>
      <xsd:element name="name"   type="xsd:string"/>
      <xsd:element name="street" type="xsd:string"/>
      <xsd:element name="city"   type="xsd:string"/>
    </xsd:sequence>
  </xsd:complexType>

  <xsd:complexType name="USAddress">
    <xsd:complexContent>
      <xsd:extension base="Address">
        <xsd:sequence>
          <xsd:element name="state" type="USState"/>
          <xsd:element name="zip"   type="xsd:positiveInteger"/>
        </xsd:sequence>
        <xsd:attribute name="country" type="xsd:NMTOKEN" fixed="US"/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>

  <xsd:complexType name="UKAddress">
    <xsd:complexContent>
      <xsd:extension base="Address">
        <xsd:sequence>
          <xsd:element name="postcode" type="UKPostcode"/>
        </xsd:sequence>
        <attribute name="exportCode" type="xsd:positiveInteger" fixed="1"/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>

  <!-- other Address derivations for more countries -->

  <xsd:simpleType name="USState">
    <xsd:restriction base="xsd:string">
      <xsd:enumeration value="AK"/>
      <xsd:enumeration value="AL"/>
      <xsd:enumeration value="AR"/>
      <xsd:enumeration value="AZ"/>
      <!-- and so on ... -->
    </xsd:restriction>
  </xsd:simpleType>

  <!-- simple type definition for UKPostcode -->
  <!-- *** pyxb mod: provide missing STD *** -->
  <xsd:simpleType name="UKPostcode">
    <xsd:restriction base="xsd:string">
      <xsd:pattern value="[A-Z]{2}\d\s\d[A-Z]{2}"/>
    </xsd:restriction>
  </xsd:simpleType>

</xsd:schema>

The XMLSchema include directive can be used to incorporate this document into po2.xsd:

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsd:include schemaLocation="file:address.xsd"/>
  <xsd:element name="purchaseOrder" type="PurchaseOrderType"/>
  <xsd:element name="comment" type="xsd:string"/>
  <xsd:complexType name="PurchaseOrderType">
    <xsd:sequence>
      <xsd:element name="shipTo" type="USAddress"/>
      <xsd:element name="billTo" type="USAddress"/>
      <xsd:element ref="comment" minOccurs="0"/>
      <xsd:element name="items"  type="Items"/>
    </xsd:sequence>
    <xsd:attribute name="orderDate" type="xsd:date"/>
  </xsd:complexType>
  <xsd:complexType name="Items">
    <xsd:sequence>
      <xsd:element name="item" minOccurs="0" maxOccurs="unbounded">
        <xsd:complexType>
          <xsd:sequence>
            <xsd:element name="productName" type="xsd:string"/>
            <xsd:element name="quantity">
              <xsd:simpleType>
                <xsd:restriction base="xsd:positiveInteger">
                  <xsd:maxExclusive value="100"/>
                </xsd:restriction>
              </xsd:simpleType>
            </xsd:element>
            <xsd:element name="USPrice"  type="xsd:decimal"/>
            <xsd:element ref="comment"   minOccurs="0"/>
            <xsd:element name="shipDate" type="xsd:date" minOccurs="0"/>
          </xsd:sequence>
          <xsd:attribute name="partNum" type="SKU" use="required"/>
        </xsd:complexType>
      </xsd:element>
    </xsd:sequence>
  </xsd:complexType>
  <!-- Stock Keeping Unit, a code for identifying products -->
  <xsd:simpleType name="SKU">
    <xsd:restriction base="xsd:string">
      <xsd:pattern value="\d{3}-[A-Z]{2}"/>
    </xsd:restriction>
  </xsd:simpleType>

</xsd:schema>

Translation of this document and execution of the test program is just as it was in the previous section:

pyxbgen \
  -u po2.xsd -m po2

Note that you do not need to explicitly list the address.xsd file. PyXB detects the include directive and reads the second schema by resolving its schemaLocation relative to the base URI of the containing document. Because the contents of the two schema files belong to the same namespace, their combined bindings are placed into the po2.py module.

Working with Namespaces

Documents of significant complexity are likely to require references to multiple namespaces. Notice that the schemas we’ve looked at so far have no namespace for both their target and default namespaces. The following schema nsaddress.xsd places the types that are in address.xsd into the namespace URN:address by defining a target namespace then including the namespace-less schema:

<xsd:schema
   targetNamespace="URN:address"
   xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsd:include schemaLocation="address.xsd"/>
</xsd:schema>

Note that this technique takes advantage of the chameleon schema pattern.

There are several ways you can prepare to process documents with multiple namespaces. If you have no expectation of using the imported namespace directly, you can process the importing schema just as before:

pyxbgen \
  -u po3.xsd -m po3

PyXB will detect the import statement, read the corresponding schema, and create bindings for its types. However, since the pyxbgen invocation did not mention the URN:address namespace, the bindings are written into a private binding file. The generated module file _address.py is created with a prefixed underscore indicating that it is not expected to be referenced directly. The public module po3.py will locally import module _address so that the required classes are available, but will not expose them to code that imports only module po3. The demonstration program demo3.py shows that things work as expected without the new namespace being made explicit.

from __future__ import print_function
import po3

order = po3.CreateFromDocument(open('po3.xml').read())

print('%s is sending %s %d thing(s):' % (order.billTo.name, order.shipTo.name, len(order.items.item)))
for item in order.items.item:
    print('  Quantity %d of %s at $%s' % (item.quantity, item.productName, item.USPrice))

More often, you will want to be able to import the module defining bindings from the additional namespaces. To do this, explicitly reference the additional schema and provide it with a module name:

pyxbgen \
  -u po3.xsd -m po3 \
  -u nsaddress.xsd -m address

Here each namespace is represented in its own module (address for URN:address and po3 for module with an absent namespace). In this case, the demonstration program is unchanged; see Creating Instances in Python Code for additional examples.

Sharing Namespace Bindings

Most often, if you have a common utility namespace like URN:address, you will want to generate its bindings once, and reference them in other schema without regenerating them. To do this, PyXB must be provided with an archive containing the schema components that were defined in that namespace, so they can be referenced in independent generation activities.

To generate the archive, you add the –archive-to-file flag to the binding generation command:

pyxbgen \
  -u nsaddress.xsd -m address \
  --archive-to-file address.wxs

In addition to generating the address Python module, this causes a archive of the schema contents to be saved in the corresponding file, which by convention ends with the extension .wxs. Any anonymous names that were generated with the bindings are also recorded in this archive, so that cross-namespace extension works correctly.

You can then generate bindings for importing namespaces by providing PyXB with the information necessary to locate this archive:

pyxbgen \
  -u po3.xsd -m po3 \
  --archive-path .:+

The –archive-path directive indicates that the current directory (.) should be searched for files that end in .wxs, and any namespaces found in such files implicitly made available for reference when they are encountered in an import instruction. (The second path component + causes the standard search path to be used after searching the current directory.)

In this case, when the import instruction is encountered, PyXB detects that it has an archive address.wxs that defines the contents of the imported namespace. Instead of reading and processing the schema, it generates references to the existing binding modules. Again, the demonstration program is unchanged.

Advanced Topics

Schemas Defined in WSDL Documents

It is a common, if regrettable, practice that web services define the structure of their documents using XML schema elements encoded directly into a types element of a WSDL specification rather than having that elements import complete standalone schema. To accommodate this, pyxbgen supports the –wsdl-location argument as an alternative to –schema-location. For example, the following will generate a module ndfd containing bindings required to communicate with the National Digital Forecast Database:

pyxbgen \
 --wsdl-location=http://www.weather.gov/forecasts/xml/DWMLgen/wsdl/ndfdXML.wsdl --module=ndfd \
 --archive-path=${PYXB_ROOT}/pyxb/bundles/wssplat//:+

Note that it will be necessary to have the WS-* bindings available, as provided by the –archive-path option above.

Customizing Binding Classes

PyXB permits you to customize the bindings that it generates by creating a module that imports the generated classes and instances, then extends them with subclasses with additional behavior. As long as you do not make major changes to the structure and names used in your namespaces, you can fine-tune the schema without changing the custom code.

The –write-for-customization option causes PyXB to generate all the Python modules in a subdirectory raw. Then you write a module that imports the generated bindings and extends them.

Until this documentation is enhanced significantly, users interested in generating custom bindings are referred to the extensions for WSDL 1.1 that are provided in the WS-* support bundle as pyxb.bundles.wssplat.wsdl11.py. An excerpt of the sort of thing done there is:

from pyxb.bundles.wssplat.raw.wsdl11 import *
import pyxb.bundles.wssplat.raw.wsdl11 as raw_wsdl11

class tParam (raw_wsdl11.tParam):
  def __getMessageReference (self):
      return self.__messageReference
  def _setMessageReference (self, message_reference):
      self.__messageReference = message_reference
  __messageReference = None
  messageReference = property(__getMessageReference)
raw_wsdl11.tParam._SetSupersedingClass(tParam)

The first line brings in all the public identifiers from the generated binding. The second makes them available in a qualified form that ensures we use the generated value rather than the customized value.

The class definition shows how to extend the generated bindings for the tParam complex type so that it has a field that can hold the instance of tMessage that was identified by the message attribute in an operation element. Following the class is a directive that tells PyXB to create instances of the customized class when automatically generating tParam instances from XML documents.

To customize bindings, you will need to be familiar with the pyxb.binding.basis._DynamicCreate_mixin class.

Be aware that _SetSupersedingClass only affects the behavior of Factory, and does not change the Python inheritance tree. This means that the superseding class is only invoked when the content model requires an instance of the original type. When an instance of a subclass of a superseded class (that is not itself superseded) is needed by the content model, this infrastructure is bypassed, the normal Python inheritance mechanism takes control, and the instance will not be an instance of the superseding class. This will happen both when instances are created in Python directly and when they are created due to presence in the binding model.

This is probably not what you will want, and to avoid it you must customize all subclasses of a customized class. A detailed example customization is in the examples/customization subdirectory of the distribution. In particular, it shows how to introspect the binding model extracted from the generated Python module and programmatically create custom binding classes without manually reproducing the content hierarchy, making the customizing module more compact and stable.

Fine-Grained Namespace Control

In certain cases, schema developers will presume that it is within their purview to re-declare or extend the contents of namespaces that belong to others. Supporting this while preserving or re-using the original namespace contents requires finesse.

For example, when generating the bindings for the OpenGIS Sensor Observation Service, you would find that this service extends the http://www.opengis.net/ogc namespace, normally defined in the OpenGIS Filter Encoding, with temporal operators that are defined in a local schema ogc4sos.xsd.

Because http://www.opengis.net/ogc is defined in a namespace archive, PyXB would normally assume that any import commands related to that namespace are redundant with the contents of that archive, and would ignore the import directive. In this case, that assumption is mistaken, and the ogc4sos.xsd schema must be read to define the additional elements and types. The required build command is:

pyxbgen \
  --schema-location=${SCHEMA_DIR}/sos/1.0.0/sosAll.xsd --module sos_1_0 \
  --archive-path=${ARCHIVE_DIR} \
  --import-augmentable-namespace=http://www.opengis.net/ogc

The –import-augmentable-namespace directive causes PyXB to allow import directives within the schema to add material to the content already loaded from an archive. Consequently, when reference to the ogc4sos.xsd schema is encountered, PyXB detects that, although it already has definitions for components in that namespace, this particular schema has not yet been read. PyXB reads the additional components, and generates bindings for the additional material into a private module _ogc which is then imported into the sos_1_0 module.

PyXB-1.2.6/doc/html/related.html0000644000175000017500000001555513152762225015727 0ustar pabpab00000000000000 Related Packages — PyXB 1.2.6 documentation
PyXB-1.2.6/doc/html/arch_binding.html0000644000175000017500000012407513152762222016711 0ustar pabpab00000000000000 Binding Model — PyXB 1.2.6 documentation

Binding Model

The binding model represents the relations between Python classes that correspond to schema components. The class hierarchy for the binding model is depicted in the following diagram.

_images/BindingModel.jpg

There are three primary groups of classes, which in turn depend on some supporting capabilities, all of which are described in the following sections.

Supporting Capabilities

Common Binding Instance Features

pyxb.binding.basis._TypeBinding_mixin is a marker class to indicate that the incorporating class represents a binding associated with a type definition (whether simple or complex). The key features of this mixin are:

  • The _ExpandedName class variable is overridden in each class to identify the type definition corresponding to the class.
  • The _XSDLocation class variable is overridden in each class to provide the line, column, and schema at which the data type definition was found. This is used in diagnostics.
  • The namespace context of the type definition is recorded to allow users to perform QName resolution of values within instance documents (see, for example, the customized bindings in pyxb.bundles.wssplat.wsdl11).
  • Each instance records the pyxb.binding.basis.element instance that determines where the type came from. The element is required in order to provide the correct name when converting the binding instance to a DOM instance on its way to expression as a text XML document.
  • The mixin is also where xsi:nil information for the instance is stored.
  • A Factory infrastructure is provided to allow creation of new instances of the binding while permitting developers to customize the generated binding classes; see Support for Customization.

Deconflicting Names

In XML schema, the namespaces for element declarations, type definitions, and attribute definitions are all distinct. Python uses the same namespace for everything. So, if you have a schema that defines a simple type color, the schema can also have an element named color with a complex type that itself has both a child element named color and a distinct attribute (of type color) that is also named color. Since the natural representation of elements and attributes inside complex types is also by their XML name, the chances of conflict are high.

PyXB resolves this by ensuring every identifiable object has a unique identifier within its context. The steps involved are:

  1. Make object name into an identifier by stripping out non-printable characters, replacing characters that cannot appear in identifiers with underscores, stripping leading underscores, and prefixing an initial digit with the character n.
  2. Deconflict the resulting identifier from Python reserved identifiers and other context-specific keywords.
  3. Prepend the standard prefix that denotes the identifier’s visibility (public, protected, private)
  4. Make the resulting identifier unique within its context (containing class or module).

These steps are encapsulated into a single function pyxb.utils.utility.PrepareIdentifier which takes parameters that customize the context for the identifier.

In addition to name conflicts with namespace-global identifiers appearing directly in the module, conflicts may also appear within a binding class as a result of collision with names from Python keywords, public class names, and public field or method names in the class. The pyxb.utils.utility._DeconflictSymbols_mixin is used to refine the set of type-specific public names. If you customize a generated binding class by extending from it, you must specify your own class variable _ReservedSymbols with a value that is the union of your symbols and those of the superclass(es) (see pyxb.utils.utility._DeconflictSymbols_mixin for details).

Deconfliction of module-level names occurs prior to code generation. Identifiers are deconflicted in favor of higher items on this list:

  • Python keywords
  • Public class identifiers
  • Element tags
  • Complex or simple type definition tags
  • Enumeration tags
  • Attribute tags

Support for Customization

One of the primary goals of PyXB is to support Python modules which customize the generated bindings by adding both functionality and derived content. Maintenance issues require that these extensions exist separately from the automatically-generated binding modules; usability requires that they inherit from the automatically-generated modules. This is supported by the pyxb.binding.basis._DynamicCreate_mixin class.

This class provides a method which is used by the generated bindings to create new instances of themselves. The raw bindings are generated into a sub-module with the prefix raw, and the extensions modify the generated class to record the real class that should be used when new instances are created as a result of converting an XML document into a binding object.

For example, if a binding is to be created in a module dinner, the --generate-raw-binding flag would be used on pyxbgen to generate the binding in a file named raw/dinner.py. The wrapper module dinner.py would contain the following code (assuming that the class parsnip was to be extended):

# Bring all public symbols up from the generated one
from raw.dinner import *
# Bring them in again, but left with their original module path
import raw.dinner
# Replace the generated parsnip with a customizing extension
class parsnip (raw.dinner.parsnip):
  # Customization here
  pass
# Register the customization for use by the binding infrastructure
raw.dinner.parsnip._SetSupersedingClass(parsnip)

With this pattern, objects created by the user through dinner.parsnip() and from XML documents by the CreateFromDOM infrastructure will both be instances of the extending wrapper class.

Simple Type Definitions

Simple type definitions derive from pyxb.binding.basis.simpleTypeDefinition and a standard Python type.

For simple types that are not derived by list or union, you can construct instances using the Factory method or directly, providing the value as an argument. New instance creation is validated against the facets recorded in the binding class.

Constraining Facets

Each class corresponding to a simple type definition has class variables for the constraining facets that are valid for that class. These variables are named by prefixing the facet name with _CF_, and have a value that is an instance of the corresponding facet class. Where possible, the variables are inherited from the parent class; when a simple type is derived by restriction, the restricted class overrides its parent with a new value for the corresponding facet.

Facets incorporate schema-specific constraining values with some code that validates potential instances of the type against the constraints. Constraining values may:

  • be of a fixed type, as with length;
  • take on a value in the value space of the simple type in which the facet appears, as with minInclusive; or
  • take on a value in the value space of the superclass of the simple type in which the facet appears, as with minExclusive;

Enumeration and pattern constraints maintain a list of the respective acceptable enumeration and pattern values.

Facets implement the pyxb.binding.facets.ConstrainingFacet.validateConstraint method, which in turn is invoked by the pyxb.binding.basis.simpleTypeDefinition.XsdConstraintsOK class method when given a value that may or may not satisfy the constraints. The Factory will normally validate the constraints before allowing a new instance to be returned.

List Types

Simple types that derive by list extend from pyxb.binding.basis.STD_list which in turn descends from the Python list type. These derived classes must override the base class pyxb.binding.basis.STD_list._ItemType value with the appropriate class to use when creating or validating list members.

When constructing an instance of a simple list type, you can provide a list as the initializer. The members of the list must be valid initializers to the underlying item type.

Union Types

Union types are classes that are never instantiated. Instead, the binding classes define a pyxb.binding.basis.STD_union._MemberTypes variable which contains a list of binding classes that are permitted as members of the union. The pyxb.binding.basis.STD_union.Factory method attempts, in turn, to create an instance of each potential member type using the arguments passed into it. The returned value is the first instance that was successfully created.

Note that this means the fact that a particular attribute in an element is a member of a union is not recorded in the attribute value. See Attribute Uses.

It is not possible to construct an instance of a union type directly. You must use the Factory method, with an argument that is acceptable as an initializer for one of the member types.

Complex Type Definitions

Complex type definitions derive from pyxb.binding.basis.complexTypeDefinition. Classes representing complex type definitions record maps that specify attribute and element use structures to record the attributes and elements that comprise the type. Each such structure is stored as a private class field and is used by Python properties to provide access to element and attribute values in a binding instance.

The base pyxb.binding.basis.complexTypeDefinition class provides the infrastructure to identify the appropriate attribute or element given an XML tag name. For classes corresponding to types that enable wildcards, it also provides a mechanism to access unrecognized elements and attributes. Wildcard elements are converted to binding instances if their namespace and name are recognized, and otherwise are left as DOM nodes. Wildcard attributes are stored in a map from their expanded name to the unicode value of the attribute.

When creating a complex type definition, you can provide the values for its attributes and fields through arguments and keywords. Keywords whose name matches an attribute or element identifier are used to set that element, bypassing the content model. Arguments are processed in order using the content model for identification and validation. See the example below.

Elements

Each element corresponds to a field in the binding instance; the field is managed through a element declaration structure. Element names are disambiguated, and a Python property is defined to retrieve and set the element value.

When the content model permits multiple occurrences of the element, its value is a Python list. The order in this list is significant.

Attributes

Each attribute corresponds to a field in the binding instance; the field is managed through a attribute use structure. Attribute names are disambiguated, and a Python property is defined to retrieve and set each attribute value.

Note that if the same name is used for both an attribute and an element, the element use takes priority. See Deconflicting Names.

Simple Content

Complex types with simple content (i.e., those in which the body of the element is an octet sequence in the lexical space of a specified simple type) are distinguished by providing a value for the class-level pyxb.binding.basis.complexTypeDefinition._TypeDefinition variable. For these types, the pyxb.binding.basis.complexTypeDefinition.content method returns the instance of that type that corresponds to the content of the object.

Users of bindings must be aware of whether a particular value is a true simple type, or a complex type with simple content. In the former case, the value descends from the corresponding Python type and can be used directly in Python expressions. In the latter, the value must be retrieved using the value method before it can be used.

As an example, consider this schema (available in examples/content):

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="numbers">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="simple" type="xs:integer"/>
        <xs:element name="complex">
          <xs:complexType>
            <xs:simpleContent>
              <xs:extension base="xs:integer">
                <xs:attribute name="style" type="xs:string"/>
              </xs:extension>
            </xs:simpleContent>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
      <xs:attribute name="attribute" type="xs:integer"/>
    </xs:complexType>
  </xs:element>
</xs:schema>

With the generated bindings, the following program:

from __future__ import print_function
from pyxb import BIND
import content

v = content.numbers(1, BIND(2), attribute=3)
v.complex.style = "decimal"
print(v.toxml("utf-8").decode('utf-8'))
print(3 * v.simple)
print(4 * v.complex.value())
print(5 * v.attribute)

produces the following output:

<?xml version="1.0" encoding="utf-8"?><numbers attribute="3"><simple>1</simple><complex style="decimal">2</complex></numbers>
3
8
15

Note that it was necessary to indicate that the second member (complex) of the numbers element needs to be wrapped in an instance of the appropriate complex type. Similarly, it was necessary to add the call to value() on the value of v.complex in order to get a valid Python numeric value. This was not necessary for v.simple or v.attribute.

Mixed and Element-Only Content

Mixed and element-only content nodes use the pyxb.binding.basis.complexTypeDefinition._ElementBindingDeclForName method to manage the mapping from XML schema element names to class members. The element and attribute names are distinct. Instances of complex types also reference a content automaton to ensure the constraints of the schema are satisfied. These structures are described in Content Model.

For these types, the pyxb.binding.basis.complexTypeDefinition.content method returns a list, in parsed order, of the Python objects and (if mixed) non-element content that belong to the instance. Be aware that this order currently does not influence the order of elements when converting bindings into XML.

Elements

Unlike the bindings for schema type definitions, which are represented as Python classes, bindings corresponding to XML Schema element declarations are represented as instances of the pyxb.binding.basis.element class. The instances can be used to create new binding instances that are associated with the element. Elements are used in the content model to identify transitions through a finite automaton.

You can use elements just like types in that they are invokable, with arguments corresponding to the arguments of the constructor of the corresponding type. See the example above.

PyXB-1.2.6/doc/html/search.html0000644000175000017500000001047213152762225015545 0ustar pabpab00000000000000 Search — PyXB 1.2.6 documentation

Search

Please activate JavaScript to enable the search functionality.

From here you can search these documents. Enter your search words into the box below and click "search". Note that the search function will automatically search for all of the words. Pages containing fewer words won't appear in the result list.

PyXB-1.2.6/doc/html/index.html0000644000175000017500000004721613152762222015412 0ustar pabpab00000000000000 PyXB: Python XML Schema Bindings — PyXB 1.2.6 documentation

PyXB: Python XML Schema Bindings

PyXB (“pixbee”) is a pure Python package that generates Python source code for classes that correspond to data structures defined by XMLSchema. The generated classes support bi-directional conversion between XML documents and Python objects. In concept it is similar to JAXB for Java and CodeSynthesis XSD for C++. A Thirty Second Example is at the bottom of this page. Step-by-step examples are in User Reference.

Getting Help

PyXB is distributed on SourceForge and PyPI, but active development has moved to Github. Inter-release updates will be available on github on the next branch of the PyXB repository.

For support, consult the Help Forum, or subscribe to and email the mailing list.

To file a bug report or see the status of defects reported against the current release, visit the Github issues page. (Older defects were archived under Trac at SourceForge; the historical data was moved to the SF ticket interface when SourceForge stopped supporting hosted applications. Do not attempt to open new issues on SourceForge.)

For a history of releases, see Release History.

Thirty Second Example

An example of a program using PyXB to interact with a web service [*] using an automatically-generated module. First, retrieve the WSDL and generate the bindings:

llc[566]$ pyxbgen \
      --wsdl-location=http://wsf.cdyne.com/WeatherWS/Weather.asmx?WSDL \
      --module=weather \
      --write-for-customization
Retrieving WSDL from http://wsf.cdyne.com/WeatherWS/Weather.asmx?WSDL
WARNING:pyxb.binding.basis:Unable to convert DOM node {http://www.w3.org/2001/XMLSchema}schema at Weather.asmx?WSDL[4:4] to binding
PS urn:uuid:8292a36c-577f-11e4-b592-c8600024e903
WARNING:pyxb.binding.generate:Complex type {http://ws.cdyne.com/WeatherWS/}ArrayOfWeatherDescription renamed to ArrayOfWeatherDescription_
WARNING:pyxb.binding.generate:Complex type {http://ws.cdyne.com/WeatherWS/}ForecastReturn renamed to ForecastReturn_
WARNING:pyxb.binding.generate:Complex type {http://ws.cdyne.com/WeatherWS/}WeatherReturn renamed to WeatherReturn_
Python for http://ws.cdyne.com/WeatherWS/ requires 1 modules

Then write a program that uses them:

from __future__ import print_function
import time
from pyxb.utils.six.moves.urllib import request as urllib_request
import weather   # Bindings generated by PyXB
import pyxb.utils.domutils as domutils

uri = 'http://wsf.cdyne.com/WeatherWS/Weather.asmx/GetCityForecastByZIP?ZIP=55113'
xml = urllib_request.urlopen(uri).read()
doc = domutils.StringToDOM(xml)
fc_return = weather.CreateFromDOM(doc.documentElement)
if fc_return.Success:
    print('Weather forecast for %s, %s:' % (fc_return.City, fc_return.State))
    for fc in fc_return.ForecastResult.Forecast:
        when = time.strftime('%A, %B %d %Y', fc.Date.timetuple())
        outlook = fc.Desciption # typos in WSDL left unchanged
        low = fc.Temperatures.MorningLow
        high = fc.Temperatures.DaytimeHigh
        print('  %s: %s, from %s to %s' % (when, outlook, low, high))

And run it:

llc[567]$ python client_get.py
Weather forecast for Saint Paul, MN:
 Wednesday, August 13 2014: Partly Cloudy, from 63 to 83
 Thursday, August 14 2014: Partly Cloudy, from 61 to 82
 Friday, August 15 2014: Partly Cloudy, from 65 to 86
 Saturday, August 16 2014: Partly Cloudy, from 67 to 84
 Sunday, August 17 2014: Partly Cloudy, from 67 to 82
 Monday, August 18 2014: Partly Cloudy, from 67 to 83
 Tuesday, August 19 2014: Partly Cloudy, from 65 to 84

That’s it.

[*]Note: Sometime between 2014 and 2017 the CDYNE Weather Service disappeared, although as of 2017-05-13 the link to its description above was still present. If you care about weather, there is a more complex example interfacing with the National Digital Forecast Database in the examples/ndfd directory.

Indices and tables

PyXB-1.2.6/doc/html/pyxb.binding.html0000644000175000017500000254710113152762223016677 0ustar pabpab00000000000000 pyxb.binding package — PyXB 1.2.6 documentation

pyxb.binding package

Submodules

pyxb.binding.basis module

This module contains support classes from which schema-specific bindings inherit, and that describe the content models of those schema.

class pyxb.binding.basis.ElementContent(value, element_declaration=None, instance=None, tag=None)

Bases: pyxb.binding.basis._Content

Marking wrapper for element content.

The value should be translated into XML and made a child of its parent.

_ElementContent__elementDeclaration = None
_ElementContent__getElementDeclaration()

The pyxb.binding.content.ElementDeclaration associated with the element content. This may be None if the value is a wildcard.

elementDeclaration

The pyxb.binding.content.ElementDeclaration associated with the element content. This may be None if the value is a wildcard.

class pyxb.binding.basis.NonElementContent(value)

Bases: pyxb.binding.basis._Content

Marking wrapper for non-element content.

The value will be unicode text, and should be appended as character data.

class pyxb.binding.basis.STD_list(*args, **kw)

Bases: pyxb.binding.basis.simpleTypeDefinition, list

Base class for collection datatypes.

This class descends from the Python list type, and incorporates simpleTypeDefinition. Subclasses must define a class variable _ItemType which is a reference to the class of which members must be instances.

classmethod XsdLiteral(value)

Convert from a binding value to a string usable in an XML document.

classmethod _ConvertArguments_vx(args, kw)
_ItemType = None

A reference to the binding class for items within this list.

classmethod _STD_list__ConvertOne(v)
_STD_list__FacetMap = {}
_STD_list__convertMany(values)
classmethod _ValidatedItem(value, kw=None)

Verify that the given value is permitted as an item of this list.

This may convert the value to the proper type, if it is compatible but not an instance of the item type. Returns the value that should be used as the item, or raises an exception if the value cannot be converted.

Parameters:kw – optional dictionary of standard constructor keywords used

when exceptions must be built. In particular, _location may be useful.

classmethod _XsdValueLength_vx(value)
classmethod _description(name_only=False, user_documentation=True)
append(x)
count(x)
extend(x, _from_xml=False)
index(x, *args)
insert(i, x)
remove(x)
class pyxb.binding.basis.STD_union(*args, **kw)

Bases: pyxb.binding.basis.simpleTypeDefinition

Base class for union datatypes.

This class descends only from simpleTypeDefinition. A pyxb.LogicError is raised if an attempt is made to construct an instance of a subclass of STD_union. Values consistent with the member types are constructed using the Factory class method. Values are validated using the _ValidatedMember class method.

Subclasses must provide a class variable _MemberTypes which is a tuple of legal members of the union.

classmethod Factory(*args, **kw)

Given a value, attempt to create an instance of some member of this union. The first instance which can be legally created is returned.

Parameters:_validate_constraints – If True (default if validation is

enabled), any constructed value is checked against constraints applied to the union as well as the member type.

Raises:pyxb.SimpleTypeValueError – no member type will permit creation of

an instance from the parameters in args and kw.

classmethod XsdLiteral(value)

Convert from a binding value to a string usable in an XML document.

_MemberTypes = None

A list of classes which are permitted as values of the union.

_STD_union__FacetMap = {}
classmethod _ValidatedMember(value)

Validate the given value as a potential union member.

Raises:pyxb.SimpleTypeValueError – the value is not an instance of a

member type.

classmethod _description(name_only=False, user_documentation=True)
class pyxb.binding.basis._Content(value)

Bases: object

Base for any wrapper added to complexTypeDefinition.orderedContent.

classmethod ContentIterator(input)

Return an iterator that filters and maps a sequence of _Content instances.

The returned iterator will filter out sequence members that are not instances of the class from which the iterator was created. Further, only the value field of the sequence member is returned.

Thus the catenated text of the non-element content of an instance can be obtained with:

text = six.u('').join(NonElementContent.ContentIterator(instance.orderedContent()))

See also pyxb.NonElementContent

_Content__getValue()

The value of the content.

This is a unicode string for NonElementContent, and (ideally) an instance of _TypeBinding_mixin for ElementContent.

_Content__value = None
value

The value of the content.

This is a unicode string for NonElementContent, and (ideally) an instance of _TypeBinding_mixin for ElementContent.

class pyxb.binding.basis._DynamicCreate_mixin(*args, **kw)

Bases: pyxb.cscRoot

Helper to allow overriding the implementation class.

Generally we’ll want to augment the generated bindings by subclassing them, and adding functionality to the subclass. This mix-in provides a way to communicate the existence of the superseding subclass back to the binding infrastructure, so that when it creates an instance it uses the subclass rather than the unaugmented binding class.

When a raw generated binding is subclassed, _SetSupersedingClass should be invoked on the raw class passing in the superseding subclass. E.g.:

class mywsdl (raw.wsdl):
  pass
raw.wsdl._SetSupersedingClass(mywsdl)
classmethod _AlternativeConstructor()

Return the class stored in the class reference attribute.

classmethod _DynamicCreate(*args, **kw)

Invoke the constructor for this class or the one that supersedes it.

classmethod _DynamicCreate_mixin__AlternativeConstructorAttribute()
classmethod _DynamicCreate_mixin__SupersedingClassAttribute()
classmethod _SetAlternativeConstructor(alternative_constructor)
classmethod _SetSupersedingClass(superseding)

Set the class reference attribute.

Parameters:superseding – A Python class that is a subclass of this class.
classmethod _SupersedingClass()

Return the class stored in the class reference attribute.

class pyxb.binding.basis._NoNullaryNonNillableNew_mixin(*args, **kw)

Bases: pyxb.cscRoot

Marker class indicating that a simple data type cannot construct a value from XML through an empty string.

This class should appear immediately simpleTypeDefinition (or whatever inherits from simpleTypeDefinition in cases where it applies.

class pyxb.binding.basis._RepresentAsXsdLiteral_mixin(*args, **kw)

Bases: pyxb.cscRoot

Marker class for data types using XSD literal string as pythonLiteral.

This is necessary for any simple data type where Python repr() produces a constructor call involving a class that may not be available by that name; e.g. duration, decimal, and any of the date/time types.

class pyxb.binding.basis._TypeBinding_mixin(*args, **kw)

Bases: pyxb.utils.utility.Locatable_mixin

classmethod Factory(*args, **kw)

Provide a common mechanism to create new instances of this type.

The class constructor won’t do, because you can’t create instances of union types.

This method may be overridden in subclasses (like STD_union). Pre- and post-creation actions can be customized on a per-class instance by overriding the _PreFactory_vx and _postFactory_vx methods.

Parameters:_dom_node – If provided, the value must be a DOM node, the

content of which will be used to set the value of the instance.

Parameters:_location – An optional instance of

pyxb.utils.utility.Location showing the origin the binding. If None, a value from _dom_node is used if available.

Parameters:_from_xml – If True, the input must be either a DOM node or

a unicode string comprising a lexical representation of a value. This is a further control on _apply_whitespace_facet and arises from cases where the lexical and value representations cannot be distinguished by type. The default value is True iff _dom_node is not None.

Parameters:_apply_whitespace_facet – If True and this is a

simpleTypeDefinition with a whiteSpace facet, the first argument will be normalized in accordance with that facet prior to invoking the parent constructor. The value is always True if text content is extracted from a _dom_node, and otherwise defaults to the defaulted value of _from_xml.

Parameters:_validate_constraints – If True, any constructed value is

checked against constraints applied to the union as well as the member type.

Parameters:_require_value – If False (default), it is permitted to

create a value without an initial value. If True and no initial value was provided, causes pyxb.SimpleContentAbsentError to be raised. Only applies to simpleTypeDefinition instances; this is used when creating values from DOM nodes.

_Abstract = False
_AttributeMap = {}

Map from expanded names to AttributeUse instances. Non-empty only in complexTypeDefinition subclasses.

_AttributeWildcard = None
classmethod _CompatibleValue(value, **kw)

Return a variant of the value that is compatible with this type.

Compatibility is defined relative to the type definition associated with the element. The value None is always compatible. If value has a Python type (e.g., int) that is a superclass of the required _TypeBinding_mixin class (e.g., xs:byte), value is used as a constructor parameter to return a new instance of the required type. Note that constraining facets are applied here if necessary (e.g., although a Python int with value 500 is type-compatible with xs:byte, it is outside the value space, and compatibility will fail).

Parameters:_convert_string_values – If True (default) and the incoming value is

a string, an attempt will be made to form a compatible value by using the string as a constructor argument to the this class. This flag is set to False when testing automaton transitions.

Raises:pyxb.SimpleTypeValueError – if the value is not both

type-consistent and value-consistent with the element’s type.

_ExpandedName = None

The expanded name of the component.

classmethod _GetValidationConfig()

The pyxb.ValidationConfig instance that applies to this class.

By default this will reference pyxb.GlobalValidationConfig.

classmethod _IsSimpleTypeContent()

Return True iff the content of this binding object is a simple type.

This is true only for descendents of simpleTypeDefinition and instances of complexTypeDefinition that have simple type content.

classmethod _IsUrType()

Return True iff this is the ur-type.

The only ur-type is {http://www.w3.org/2001/XMLSchema}anyType. The implementation of this method is overridden for pyxb.binding.datatypes.anyType.

classmethod _Name()

Return the best descriptive name for the type of the instance.

This is intended to be a human-readable value used in diagnostics, and is the expanded name if the type has one, or the Python type name if it does not.

classmethod _PerformValidation()

Determine whether the content model should be validated for this class.

In the absence of context, this returns True iff both binding and document validation are in force.

Deprecated:use _GetValidationConfig and check specific requirements.
classmethod _PreFactory_vx(args, kw)

Method invoked upon entry to the Factory method.

This method is entitled to modify the keywords array. It can also return a state value which is passed to _postFactory_vx.

_PyXBFactoryKeywords = ('_dom_node', '_fallback_namespace', '_from_xml', '_apply_whitespace_facet', '_validate_constraints', '_require_value', '_nil', '_element', '_apply_attributes', '_convert_string_values', '_location')

Keywords that are interpreted by __new__ or __init__ in one or more classes in the PyXB type hierarchy. All these keywords must be removed before invoking base Python __init__ or __new__.

classmethod _RequireXSIType(value_type)
_ReservedSymbols = set(['toDOM', 'property', 'toxml', 'Factory', 'validateBinding'])
classmethod _SetValidationConfig(validation_config)

Set the validation configuration for this class.

classmethod _TypeBinding_mixin__AttributesFromDOM(node)
_TypeBinding_mixin__WarnedUnassociatedElement = False
_TypeBinding_mixin__checkNilCtor(args)
_TypeBinding_mixin__constructedWithValue = False
_TypeBinding_mixin__element = None
_TypeBinding_mixin__getValidationConfig()

The pyxb.ValidationConfig instance that applies to this instance.

By default this will reference the class value from _GetValidationConfig, which defaults to pyxb.GlobalValidationConfig.

_TypeBinding_mixin__namespaceContext = None
_TypeBinding_mixin__xsiNil = None
_XSDLocation = None

Where the definition can be found in the originating schema.

_constructedWithValue()
_diagnosticName()

The best name available for this instance in diagnostics.

If the instance is associated with an element, it is the element name; otherwise it is the best name for the type of the instance per _Name.

_element()

Return a pyxb.binding.basis.element associated with the binding instance.

This will return None unless an element has been associated. Constructing a binding instance using the element instance will add this association.

_finalizeContentModel()

Inform content model that all additions have been provided.

This is used to resolve any pending non-determinism when the content of an element is provided through a DOM assignment or through positional arguments in a constructor.

_isNil()

Indicate whether this instance is U{nil <http://www.w3.org/TR/xmlschema-1/#xsi_nil>}.

The value is set by the DOM and SAX parsers when building an instance from a DOM element with U{xsi:nil <http://www.w3.org/TR/xmlschema-1/#xsi_nil>} set to true.

Returns:None if the element used to create the instance is not

nillable<http://www.w3.org/TR/xmlschema-1/#nillable>. If it is nillable, returns True or False depending on whether the instance itself is nil<http://www.w3.org/TR/xmlschema-1/#xsi_nil>.

_namespaceContext()

Return a namespace context associated with the binding instance.

This will return None unless something has provided a context to the instance. Context is provided when instances are generated by the DOM and SAX-based translators.

_performValidation()

Determine whether the content model should be validated for this instance.

In the absence of context, this returns True iff both binding and document validation are in force.

Deprecated:use _validationConfig and check specific requirements.
_postDOMValidate()
_postFactory_vx(state)

Method invoked prior to leaving the Factory method.

This is an instance method, and is given the state that was returned by _PreFactory_vx.

_resetContent(reset_elements=False)

Reset the content of an element value.

This is not a public method.

For simple types, this does nothing. For complex types, this clears the content array, removing all non-element content from the instance. It optionally also removes all element content.

Parameters:reset_elements – If False (default) only the content array is

cleared, which has the effect of removing any preference for element order when generating a document. If True, the element content stored within the binding is also cleared, leaving it with no content at all.

Note:This is not the same thing as complexTypeDefinition.reset,

which unconditionally resets attributes and element and non-element content.

_setAttributesFromKeywordsAndDOM(kw, dom_node)

Invoke self._setAttribute based on node attributes and keywords.

Though attributes can only legally appear in complexTypeDefinition instances, delayed conditional validation requires caching them in simpleTypeDefinition.

Parameters:kw – keywords passed to the constructor. This map is mutated by

the call: keywords corresponding to recognized attributes are removed.

Parameters:dom_node – an xml.dom Node instance, possibly None
_setElement(elt)

Associate an element binding with the instance.

Since the value of a binding instance reflects only its content, an associated element is necessary to generate an XML document or DOM tree.

Parameters:elt – the pyxb.binding.basis.element instance associated with

the value. This may be None when disassociating a value from a specific element.

_setIsNil(nil=True)

Set the xsi:nil property of the instance.

Parameters:nilTrue if the value of xsi:nil should be true,

False if the value of xsi:nil should be false.

Raises:pyxb.NoNillableSupportError – the instance is not associated

with an element that is L{nillable <pyxb.binding.basis.element.nillable>}.

_setNamespaceContext(namespace_context)

Associate a namespace context with the binding instance.

_setValidationConfig(validation_config)

Set the validation configuration for this instance.

_substitutesFor(element)
_toDOM_csc(dom_support, parent)
_validateBinding_vx()

Override in subclasses for type-specific validation of instance content.

Returns:

True if the instance validates

Raises:
  • pyxb.BatchContentValidationError – complex content does not match model
  • pyxb.SimpleTypeValueError – simple content fails to satisfy constraints
_validationConfig

The pyxb.ValidationConfig instance that applies to this instance.

By default this will reference the class value from _GetValidationConfig, which defaults to pyxb.GlobalValidationConfig.

_validationConfig_ = <pyxb.ValidationConfig object>
toDOM(bds=None, parent=None, element_name=None)

Convert this instance to a DOM node.

The name of the top-level element is either the name of the element instance associated with this instance, or the XML name of the type of this instance.

Parameters:

otherwise, the created element is a child of the given element. :type parent: xml.dom.Element or None :rtype: xml.dom.Document

toxml(encoding=None, bds=None, root_only=False, element_name=None)

Shorthand to get the object as an XML document.

If you want to set the default namespace, pass in a pre-configured bds.

Parameters:encoding – The encoding to be used. See

@:py:obj:xml.dom.Node.toxml() for a description of why you should always pass @:py:obj:‘utf-8’ here. Because this method follows the contract of the corresponding xml.dom.Node method, it does not automatically get the default PyXB output encoding.

Parameters:bds – Optional pyxb.utils.domutils.BindingDOMSupport instance

to use for creation. If not provided (default), a new generic one is created.

Parameters:root_only – Set to True to automatically deference the

documentElement of the resulting DOM node. This eliminates the XML declaration that would otherwise be generated.

Parameters:element_name – This value is passed through to toDOM, and is

useful when the value has no bound element but you want to convert it to XML anyway.

validateBinding()

Check whether the binding content matches its content model.

Returns:

True if validation succeeds.

Raises:
  • pyxb.BatchContentValidationError – complex content does not match model
  • pyxb.SimpleTypeValueError – attribute or simple content fails to satisfy constraints
class pyxb.binding.basis.complexTypeDefinition(*args, **kw)

Bases: pyxb.binding.basis._TypeBinding_mixin, pyxb.utils.utility._DeconflictSymbols_mixin, pyxb.binding.basis._DynamicCreate_mixin

Base for any Python class that serves as the binding for an XMLSchema complexType.

Subclasses should define a class-level _AttributeMap variable which maps from the unicode tag of an attribute to the AttributeUse instance that defines it. Similarly, subclasses should define an _ElementMap variable.

classmethod _AddElement(element)

Method used by generated code to associate the element binding with a use in this type.

This is necessary because all complex type classes appear in the module prior to any of the element instances (which reference type classes), so the association must be formed after the element instances are available.

_Automaton = None
_CT_ELEMENT_ONLY = 'ELEMENT_ONLY'
_CT_EMPTY = 'EMPTY'
_CT_MIXED = 'MIXED'
_CT_SIMPLE = 'SIMPLE'
_ContentTypeTag = None
classmethod _ElementBindingDeclForName(element_name)

Determine what the given name means as an element in this type.

Normally, element_name identifies an element definition within this type. If so, the returned element_decl identifies that definition, and the element_binding is extracted from that use.

It may also be that the element_name does not appear as an element definition, but that it identifies a global element. In that case, the returned element_binding identifies the global element. If, further, that element is a member of a substitution group which does have an element definition in this class, then the returned element_decl identifies that definition.

If a non-None element_decl is returned, there will be an associated element_binding. However, it is possible to return a non-None element_binding, but None as the element_decl. In that case, the element_binding can be used to create a binding instance, but the content model will have to treat it as a wildcard.

Parameters:element_name – The name of the element in this type, either an

expanded name or a local name if the element has an absent namespace.

Returns:( element_binding, element_decl )
_ElementMap = {}

Map from expanded names to ElementDeclaration instances.

_HasWildcardElement = False
classmethod _IsMixed()
classmethod _IsSimpleTypeContent()

CTDs with simple content are simple; other CTDs are not.

_ReservedSymbols = set(['toDOM', 'reset', 'toxml', 'orderedContent', 'xsdConstraintsOK', 'extend', 'wildcardElements', 'Factory', 'value', 'content', 'validateBinding', 'wildcardAttributeMap', 'property', 'append'])
_TypeDefinition = None

Subclass of simpleTypeDefinition that corresponds to the type content. Only valid if _ContentTypeTag is _CT_SIMPLE

classmethod _UseForTag(tag, raise_if_fail=True)

Return the ElementDeclaration object corresponding to the element name.

Parameters:tag – The ExpandedName of an element in the class.
_addContent(wrapped_value)
_appendWildcardElement(value)
_automatonConfiguration()

For whitebox testing use only

_complexTypeDefinition__NeedWarnOnContent = True
classmethod _complexTypeDefinition__WarnOnContent()
_complexTypeDefinition__automatonConfiguration = None
_complexTypeDefinition__childrenForDOM()

Generate a list of children in the order in which they should be added to the parent when creating a DOM representation of this object.

Note:This is only used when pyxb.RequireValidWhenGenerating has

disabled validation. Consequently, it may not generate valid XML.

_complexTypeDefinition__content = None
_complexTypeDefinition__setContent(value)
_complexTypeDefinition__wildcardAttributeMap = None
_complexTypeDefinition__wildcardElements = None
classmethod _description(name_only=False, user_documentation=True)
_finalizeContentModel()
_postDOMValidate()
_resetAutomaton()
_resetContent(reset_elements=False)
_setAttribute(attr_en, value_lex)
_setDOMFromAttributes(dom_support, element)

Add any appropriate attributes from this instance into the DOM element.

_setValue(value)

Change the simple content value without affecting attributes.

_symbolSet()

Return a map from content.ElementDeclaration instances to a list of values associated with that use.

This is used as the set of symbols available for transitions when validating content against a model. Note that the original content.ElementUse that may have validated the assignment of the symbol to the content is no longer available, which may result in a different order being generated by the content model. Preservation of the original order mitigates this risk.

The value None is used to provide the wildcard members, if any.

If an element use has no associated values, it must not appear in the returned map.

Raises:pyxb.SimpleTypeValueError – when unable to convert element

content to the binding declaration type.

_toDOM_csc(dom_support, parent)

Create a DOM element with the given tag holding the content of this instance.

_validateAttributes()
_validateBinding_vx()
_validatedChildren()

Provide the child elements and non-element content in an order consistent with the content model.

Returns a sequence of tuples representing a valid path through the content model where each transition corresponds to one of the member element instances within this instance. The tuple is a pair comprising the content.ElementDeclaration instance and the value for the transition.

If the content of the instance does not validate against the content model, an exception is raised.

Returns:None or a list as described above.
append(value, **kw)

Add the value to the instance.

The value should be a DOM node or other value that is or can be converted to a binding instance, or a string if the instance allows mixed content. The value must be permitted by the content model.

Raises:pyxb.ContentValidationError – the value is not permitted at the current

state of the content model.

content()

Legacy interface for ordered content.

This version does not accurately distinguish non-element content from element content that happens to have unicode type.

Deprecated:use orderedContent.
extend(value_list, _fallback_namespace=None, _from_xml=False, _location=None)

Invoke append for each value in the list, in turn.

orderedContent()

Return the element and non-element content of the instance in order.

This must be a complex type with complex content. The return value is a list of the element and non-element content in a preferred order.

The returned list contains element and non-element content in the order which it was added to the instance. This may have been through parsing a document, constructing an instance using positional arguments, invoking the append or extend methods, or assigning directly to an instance attribute associated with an element binding.

Note:Be aware that assigning directly to an element attribute does not

remove any previous value for the element from the content list.

Note:Be aware that element values directly appended to an instance

attribute with list type (viz., that corresponds to an element that allows more than one occurrence) will not appear in the ordered content list.

The order in the list may influence the generation of documents depending on pyxb.ValidationConfig values that apply to an instance. Non-element content is emitted immediately prior to the following element in this list. Any trailing non-element content is emitted after the last element in the content. The list should include all element content. Element content in this list that is not present within an element member of the binding instance may result in an error, or may be ignored.

Note:The returned value is mutable, allowing the caller to change

the order to be used.

Raises:pyxb.NotComplexContentError – this is not a complex type with mixed or element-only content
reset()

Reset the instance.

This resets all element and attribute fields, and discards any recorded content. It resets the content model automaton to its initial state.

See:Manipulate the return value of orderedContent if your intent is

to influence the generation of documents from the binding instance without changing its (element) content.

value()

Return the value of the element.

This must be a complex type with simple content. The returned value is expected to be an instance of some simpleTypeDefinition class.

Raises:pyxb.NotSimpleContentError – this is not a complex type with simple content
wildcardAttributeMap()

Obtain access to wildcard attributes.

The return value is None if this type does not support wildcard attributes. If wildcard attributes are allowed, the return value is a map from QNames to the unicode string value of the corresponding attribute.

Todo:The map keys should be namespace extended names rather than

QNames, as the in-scope namespace may not be readily available to the user.

wildcardElements()

Obtain access to wildcard elements.

The return value is None if the content model for this type does not support wildcard elements. If wildcard elements are allowed, the return value is a list of values corresponding to conformant unrecognized elements, in the order in which they were encountered. If the containing binding was created from an XML document and enough information was present to determine the binding of the member element, the value is a binding instance. Otherwise, the value is the original DOM Element node.

xsdConstraintsOK(location=None)

Validate the content against the simple type.

Returns:

True if the content validates against its type.

Raises:
  • pyxb.NotSimpleContentError – this type does not have simple content.
  • pyxb.SimpleContentAbsentError – the content of this type has not been set
class pyxb.binding.basis.element(name, type_definition, scope=None, nillable=False, abstract=False, unicode_default=None, fixed=False, substitution_group=None, documentation=None, location=None)

Bases: pyxb.utils.utility._DeconflictSymbols_mixin, pyxb.binding.basis._DynamicCreate_mixin

Class that represents a schema element within a binding.

This gets a little confusing. Within a schema, the pyxb.xmlschema.structures.ElementDeclaration type represents an U{element declaration<http://www.w3.org/TR/xmlschema-1/#cElement_Declarations>}. Those declarations may be global (have a name that is visible in the namespace), or local (have a name that is visible only within a complex type definition). Further, local (but not global) declarations may have a reference to a global declaration (which might be in a different namespace).

Within a PyXB binding, the element declarations from the original complex type definition that have the same QName<http://www.w3.org/TR/1999/REC-xml-names-19990114/#dt-qname> (after deconflicting the LocalPart<http://www.w3.org/TR/1999/REC-xml-names-19990114/#NT-LocalPart>) are associated with an attribute in the class for the complex type. Each of these attributes is defined via a pyxb.binding.content.ElementDeclaration which provides the mechanism by which the binding holds values associated with that element.

Furthermore, in the FAC-based content model each schema element declaration is associated with an ElementUse instance to locate the point in the schema where content came from. Instances that refer to the same schema element declaration share the same underlying pyxb.binding.content.ElementDeclaration.

This element isn’t any of those elements. This element is the type used for an attribute which associates the name of a element with data required to represent it, all within a particular scope (a module for global scope, the binding class for a complex type definition for local scope). From the perspective of a PyXB user they look almost like a class, in that you can call them to create instances of the underlying complex type.

Global and local elements are represented by instances of this class.

classmethod AnyCreateFromDOM(node, fallback_namespace)

Create an instance of an element from a DOM node.

This method does minimal processing of node and delegates to CreateDOMBinding.

Parameters:node – An xml.dom.Node representing a root element. If the

node is a document, that document’s root node will be substituted. The name of the node is extracted as the name of the element to be created, and the node and the name are passed to CreateDOMBinding.

Parameters:fallback_namespace – The value to pass as _fallback_namespace

to CreateDOMBinding

Returns:As with CreateDOMBinding
classmethod CreateDOMBinding(node, element_binding, **kw)

Create a binding from a DOM node.

Parameters:
  • node – The DOM node
  • element_binding – An instance of element that would normally

be used to determine the type of the binding. The actual type of object returned is determined by the type definition associated with the element_binding and the value of any U{xsi:type <http://www.w3.org/TR/xmlschema-1/#xsi_type>} attribute found in node, modulated by XSI._InterpretTypeAttribute.

Parameters:_fallback_namespace – The namespace to use as the namespace for

the node, if the node name is unqualified. This should be an absent namespace.

Returns:A binding for the DOM node.
Raises:pyxb.UnrecognizedDOMRootNodeError – if no underlying element or

type for the node can be identified.

_createFromDOM(node, expanded_name, **kw)

Create an instance from a DOM node given the name of an element.

This method does minimal processing of node and expanded_name and delegates to CreateDOMBinding.

Parameters:node – An xml.dom.Node representing a root element. If the

node is a document, that document’s root node will be substituted. The value is passed to CreateDOMBinding.

Parameters:expanded_name – The expanded name of the element to be used for

content. This is passed to elementForName to obtain the binding that is passed to CreateDOMBinding, superseding any identification that might be inferred from node. If no name is available, use createFromDOM.

Note:Keyword parameters are passed to CreateDOMBinding.
Returns:As with CreateDOMBinding.
_description(name_only=False, user_documentation=True)
_element__abstract = False
_element__defaultValue = None
_element__documentation = None
_element__fixed = False
_element__name = None
_element__nillable = False
_element__scope = None
_element__substitutionGroup = None
_element__typeDefinition = None
_element__xsdLocation = None
_real_substitutesFor(other)

Determine whether an instance of this element can substitute for the other element.

See Substitution Group OK<http://www.w3.org/TR/xmlschema-1/#cos-equiv-derived-ok-rec>.

Todo:Do something about blocking constraints. This ignores them, as

does everything leading to this point.

_setSubstitutionGroup(substitution_group)
abstract()

Indicate whether this element is abstract (must use substitution group members for matches).

compatibleValue(value, **kw)

Return a variant of the value that is compatible with this element.

This mostly defers to _TypeBinding_mixin._CompatibleValue.

Raises:pyxb.SimpleTypeValueError – if the value is not both

type-consistent and value-consistent with the element’s type.

createFromDOM(node, fallback_namespace=None, **kw)

Create an instance of this element using a DOM node as the source of its content.

This method does minimal processing of node and delegates to _createFromDOM.

Parameters:node – An xml.dom.Node representing a root element. If the

node is a document, that document’s root node will be substituted. The name of the node is extracted as the name of the element to be created, and the node and the name are passed to _createFromDOM

Parameters:fallback_namespace – Used as default for

_fallback_namespace in call to _createFromDOM

Note:Keyword parameters are passed to CreateDOMBinding.
Returns:As with _createFromDOM
defaultValue()

The default value of the element.

None if the element has no default value.

Note:A non-None value is always an instance of a simple type,

even if the element has complex content.

documentation()

Contents of any documentation annotation in the definition.

elementForName(name)

Return the element that should be used if this element binding is permitted and an element with the given name is encountered.

Normally, the incoming name matches the name of this binding, and self is returned. If the incoming name is different, it is expected to be the name of a global element which is within this element’s substitution group. In that case, the binding corresponding to the named element is return.

Returns:An instance of element, or None if no element with the

given name can be found.

findSubstituendDecl(ctd_class)
fixed()

True if the element content cannot be changed

memberElement(name)

Return a reference to the element instance used for the given name within this element.

The type for this element must be a complex type definition.

name()

The expanded name of the element within its scope.

nillable()

Indicate whether values matching this element can have U{nil <http://www.w3.org/TR/xmlschema-1/#xsi_nil>} set.

scope()

The scope of the element. This is either None, representing a top-level element, or an instance of complexTypeDefinition for local elements.

substitutesFor(other)

Stub replaced by _real_substitutesFor when element supports substitution groups.

substitutionGroup()

The element instance to whose substitution group this element belongs. None if this element is not part of a substitution group.

typeDefinition()

The _TypeBinding_mixin subclass for values of this element.

xsdLocation()

The pyxb.utils.utility.Location where the element appears in the schema.

class pyxb.binding.basis.enumeration_mixin(*args, **kw)

Bases: pyxb.cscRoot

Marker in case we need to know that a PST has an enumeration constraint facet.

_ReservedSymbols = set(['items', 'values', 'itervalues', 'iteritems'])
classmethod _elementForValue(value)

Return the _EnumerationElement instance that has the given value.

Raises:KeyError – the value is not valid for the enumeration.
classmethod _valueForUnicode(ustr)

Return the enumeration value corresponding to the given unicode string.

If ustr is not a valid option for this enumeration, return None.

classmethod items()

Return the associated pyxb.binding.facet._EnumerationElement instances.

classmethod iteritems()

Generate the associated pyxb.binding.facet._EnumerationElement instances.

classmethod itervalues()

Return a generator for the values that the enumeration can take.

classmethod values()

Return a list of values that the enumeration can take.

class pyxb.binding.basis.simpleTypeDefinition(*args, **kw)

Bases: pyxb.binding.basis._TypeBinding_mixin, pyxb.utils.utility._DeconflictSymbols_mixin, pyxb.binding.basis._DynamicCreate_mixin

simpleTypeDefinition is a base class that is part of the hierarchy of any class that represents the Python datatype for a SimpleTypeDefinition.

Note:This class, or a descendent of it, must be the first class

in the method resolution order when a subclass has multiple parents. Otherwise, constructor keyword arguments may not be removed before passing them on to Python classes that do not accept them.

classmethod PythonLiteral(value)

Return a string which can be embedded into Python source to represent the given value as an instance of this class.

classmethod SimpleTypeDefinition()

Return the SimpleTypeDefinition instance for the given class.

This should only be invoked when generating bindings. An STD must have been associated with the class using _SimpleTypeDefinition.

classmethod XsdConstraintsOK(value, location=None)

Validate the given value against the constraints on this class.

Raises:pyxb.SimpleTypeValueError – if any constraint is violated.
classmethod XsdLiteral(value)

Convert from a python value to a string usable in an XML document.

This should be implemented in the subclass.

classmethod XsdSuperType()

Find the nearest parent class in the PST hierarchy.

The value for anySimpleType is None; for all others, it’s a primitive or derived PST descendent (including anySimpleType).

classmethod XsdValueLength(value)

Return the length of the given value.

The length is calculated by a subclass implementation of _XsdValueLength_vx in accordance with http://www.w3.org/TR/xmlschema-2/#rf-length.

The return value is a non-negative integer, or None if length constraints should be considered trivially satisfied (as with QName and NOTATION).

Raises:
  • pyxb.LogicError – the provided value is not an instance of cls.
  • pyxb.LogicError – an attempt is made to calculate a length for

an instance of a type that does not support length calculations.

classmethod _CheckValidValue(value)

NB: Invoking this on a value that is a list will, if necessary, replace the members of the list with new values that are of the correct item type. This is permitted because only with lists is it possible to bypass the normal content validation (by invoking append/extend on the list instance).

classmethod _ConvertArguments(args, kw)

Pre-process the arguments.

This is used before invoking the parent constructor. One application is to apply the whitespace facet processing; if such a request is in the keywords, it is removed so it does not propagate to the superclass. Another application is to convert the arguments from a string to a list. Binding-specific applications are performed in the overloaded _ConvertArguments_vx method.

classmethod _ConvertArguments_vx(args, kw)
classmethod _FacetMap()

Return a reference to the facet map for this datatype.

The facet map is a map from leaf facet classes to instances of those classes that constrain or otherwise apply to the lexical or value space of the datatype. Classes may inherit their facet map from their superclass, or may create a new class instance if the class adds a new constraint type.

Raises:AttributeError – if the facet map has not been defined
classmethod _InitializeFacetMap(*args)

Initialize the facet map for this datatype.

This must be called exactly once, after all facets belonging to the datatype have been created.

Raises:
  • pyxb.LogicError – if called multiple times (on the same class)
  • pyxb.LogicError – if called when a parent class facet map has not been initialized
Returns:

the facet map

classmethod _IsSimpleTypeContent()

STDs have simple type content.

classmethod _IsValidValue(value)
_ReservedSymbols = set(['toDOM', 'toxml', 'xsdConstraintsOK', 'XsdValueLength', 'xsdLiteral', 'Factory', 'pythonLiteral', 'XsdPythonType', 'XsdConstraintsOK', 'xsdValueLength', 'XsdLiteral', 'XsdSuperType', 'PythonLiteral', 'validateBinding', 'property', 'SimpleTypeDefinition'])

Symbols that remain the responsibility of this class. Any public symbols in generated binding subclasses are deconflicted by providing an alternative name in the subclass. (There currently are no public symbols in generated SimpleTypeDefinion bindings.

classmethod _SimpleTypeDefinition(std)

Set the pyxb.xmlschema.structures.SimpleTypeDefinition instance associated with this binding.

classmethod _XsdConstraintsPreCheck_vb(value)

Pre-extended class method to verify other things before checking constraints.

This is used for list types, to verify that the values in the list are acceptable, and for token descendents, to check the lexical/value space conformance of the input.

_checkValidValue()
classmethod _description(name_only=False, user_documentation=True)
_isValidValue()
_setAttribute(attr_en, value_lex)
_simpleTypeDefinition__ClassFacetSequence = {}
_simpleTypeDefinition__FacetMap = {}
classmethod _simpleTypeDefinition__FacetMapAttributeName()
_simpleTypeDefinition__FacetMapAttributeNameMap = {<class 'pyxb.binding.datatypes.Name'>: u'_httpwww_w3_org2001XMLSchema_Name_FacetMap', <class 'pyxb.binding.datatypes.token'>: u'_httpwww_w3_org2001XMLSchema_token_FacetMap', <class 'pyxb.binding.datatypes.short'>: u'_httpwww_w3_org2001XMLSchema_short_FacetMap', <class 'pyxb.binding.facets._WhiteSpace_enum'>: u'_httpwww_w3_org2001XMLSchema__WhiteSpace_enum_FacetMap', <class 'pyxb.binding.datatypes.anyURI'>: u'_httpwww_w3_org2001XMLSchema_anyURI_FacetMap', <class 'pyxb.binding.datatypes.unsignedByte'>: u'_httpwww_w3_org2001XMLSchema_unsignedByte_FacetMap', <class 'pyxb.binding.basis.STD_list'>: u'_STD_list_FacetMap', <class 'pyxb.binding.datatypes.normalizedString'>: u'_httpwww_w3_org2001XMLSchema_normalizedString_FacetMap', <class 'pyxb.binding.datatypes.int'>: u'_httpwww_w3_org2001XMLSchema_int_FacetMap', <class 'pyxb.binding.datatypes._fp'>: u'_fp_FacetMap', <class 'pyxb.binding.datatypes.negativeInteger'>: u'_httpwww_w3_org2001XMLSchema_negativeInteger_FacetMap', <class 'pyxb.binding.datatypes.integer'>: u'_httpwww_w3_org2001XMLSchema_integer_FacetMap', <class 'pyxb.binding.datatypes.positiveInteger'>: u'_httpwww_w3_org2001XMLSchema_positiveInteger_FacetMap', <class 'pyxb.binding.datatypes.hexBinary'>: u'_httpwww_w3_org2001XMLSchema_hexBinary_FacetMap', <class 'pyxb.binding.datatypes.ENTITY'>: u'_httpwww_w3_org2001XMLSchema_ENTITY_FacetMap', <class 'pyxb.binding.datatypes.unsignedShort'>: u'_httpwww_w3_org2001XMLSchema_unsignedShort_FacetMap', <class 'pyxb.binding.datatypes.gDay'>: u'_httpwww_w3_org2001XMLSchema_gDay_FacetMap', <class 'pyxb.binding.datatypes.IDREF'>: u'_httpwww_w3_org2001XMLSchema_IDREF_FacetMap', <class 'pyxb.binding.datatypes.unsignedLong'>: u'_httpwww_w3_org2001XMLSchema_unsignedLong_FacetMap', <class 'pyxb.binding.datatypes.gYear'>: u'_httpwww_w3_org2001XMLSchema_gYear_FacetMap', <class 'pyxb.binding.datatypes.float'>: u'_httpwww_w3_org2001XMLSchema_float_FacetMap', <class 'pyxb.binding.datatypes.unsignedInt'>: u'_httpwww_w3_org2001XMLSchema_unsignedInt_FacetMap', <class 'pyxb.binding.datatypes.NCName'>: u'_httpwww_w3_org2001XMLSchema_NCName_FacetMap', <class 'pyxb.binding.datatypes.byte'>: u'_httpwww_w3_org2001XMLSchema_byte_FacetMap', <class 'pyxb.binding.datatypes.NMTOKENS'>: u'_NMTOKENS_FacetMap', <class 'pyxb.binding.datatypes.string'>: u'_httpwww_w3_org2001XMLSchema_string_FacetMap', <class 'pyxb.binding.datatypes.anySimpleType'>: u'_httpwww_w3_org2001XMLSchema_anySimpleType_FacetMap', <class 'pyxb.binding.datatypes._PyXBDateOnly_base'>: u'_PyXBDateOnly_base_FacetMap', <class 'pyxb.binding.datatypes.NOTATION'>: u'_httpwww_w3_org2001XMLSchema_NOTATION_FacetMap', <class 'pyxb.binding.datatypes.boolean'>: u'_httpwww_w3_org2001XMLSchema_boolean_FacetMap', <class 'pyxb.binding.datatypes.nonPositiveInteger'>: u'_httpwww_w3_org2001XMLSchema_nonPositiveInteger_FacetMap', <class 'pyxb.binding.datatypes._PyXBDateTime_base'>: u'_PyXBDateTime_base_FacetMap', <class 'pyxb.binding.datatypes.long'>: u'_httpwww_w3_org2001XMLSchema_long_FacetMap', <class 'pyxb.binding.datatypes.date'>: u'_httpwww_w3_org2001XMLSchema_date_FacetMap', <class 'pyxb.binding.datatypes.time'>: u'_httpwww_w3_org2001XMLSchema_time_FacetMap', <class 'pyxb.binding.datatypes.QName'>: u'_httpwww_w3_org2001XMLSchema_QName_FacetMap', <class 'pyxb.binding.datatypes.language'>: u'_httpwww_w3_org2001XMLSchema_language_FacetMap', <class 'pyxb.binding.datatypes.dateTime'>: u'_httpwww_w3_org2001XMLSchema_dateTime_FacetMap', <class 'pyxb.binding.basis.simpleTypeDefinition'>: '_simpleTypeDefinition__FacetMap', <class 'pyxb.binding.datatypes.NMTOKEN'>: u'_httpwww_w3_org2001XMLSchema_NMTOKEN_FacetMap', <class 'pyxb.binding.datatypes.ENTITIES'>: u'_httpwww_w3_org2001XMLSchema_ENTITIES_FacetMap', <class 'pyxb.binding.datatypes.duration'>: u'_httpwww_w3_org2001XMLSchema_duration_FacetMap', <class 'pyxb.binding.datatypes.gMonth'>: u'_httpwww_w3_org2001XMLSchema_gMonth_FacetMap', <class 'pyxb.binding.datatypes.gYearMonth'>: u'_httpwww_w3_org2001XMLSchema_gYearMonth_FacetMap', <class 'pyxb.binding.datatypes.IDREFS'>: u'_httpwww_w3_org2001XMLSchema_IDREFS_FacetMap', <class 'pyxb.binding.datatypes.double'>: u'_httpwww_w3_org2001XMLSchema_double_FacetMap', <class 'pyxb.binding.datatypes.gMonthDay'>: u'_httpwww_w3_org2001XMLSchema_gMonthDay_FacetMap', <class 'pyxb.binding.datatypes.base64Binary'>: u'_httpwww_w3_org2001XMLSchema_base64Binary_FacetMap', <class 'pyxb.binding.datatypes.decimal'>: u'_httpwww_w3_org2001XMLSchema_decimal_FacetMap', <class 'pyxb.binding.datatypes.ID'>: u'_httpwww_w3_org2001XMLSchema_ID_FacetMap', <class 'pyxb.binding.datatypes.nonNegativeInteger'>: u'_httpwww_w3_org2001XMLSchema_nonNegativeInteger_FacetMap'}
classmethod _simpleTypeDefinition__STDAttrName()
_toDOM_csc(dom_support, parent)
_validateBinding_vx()
pythonLiteral()

Return a string which can be embedded into Python source to represent the value of this instance.

xsdConstraintsOK(location=None)

Validate the value of this instance against its constraints.

xsdLiteral()

Return text suitable for representing the value of this instance in an XML document.

The base class implementation delegates to the object class’s XsdLiteral method.

xsdValueLength()

Return the length of this instance within its value space.

See XsdValueLength.

pyxb.binding.content module

Helper classes that maintain the content model of XMLSchema in the binding classes.

AttributeUse and ElementDeclaration record information associated with a binding class, for example the types of values, the original XML QName or NCName, and the Python field in which the values are stored. They also provide the low-level interface to set and get the corresponding values in a binding instance.

Wildcard holds content-related information used in the content model.

class pyxb.binding.content.AttributeUse(name, id, key, data_type, unicode_default=None, fixed=False, required=False, prohibited=False)

Bases: pyxb.cscRoot

A helper class that encapsulates everything we need to know about the way an attribute is used within a binding class.

Attributes are stored internally as pairs (provided, value), where provided is a boolean indicating whether a value for the attribute was provided externally, and value is an instance of the attribute datatype. The provided flag is used to determine whether an XML attribute should be added to a created DOM node when generating the XML corresponding to a binding instance.

_AttributeUse__dataType = None
_AttributeUse__defaultValue = None
_AttributeUse__fixed = False
_AttributeUse__getProvided(ctd_instance)
_AttributeUse__getValue(ctd_instance)

Retrieve the value information for this attribute in a binding instance.

Parameters:ctd_instance (subclass of pyxb.binding.basis.complexTypeDefinition) – The instance object from which the attribute is to be retrieved.
Returns:(provided, value) where provided is a bool and

value is None or an instance of the attribute’s datatype.

_AttributeUse__id = None
_AttributeUse__key = None
_AttributeUse__name = None
_AttributeUse__prohibited = False
_AttributeUse__required = False
_AttributeUse__setValue(ctd_instance, new_value, provided)
_AttributeUse__unicodeDefault = None
_description(name_only=False, user_documentation=True)
addDOMAttribute(dom_support, ctd_instance, element)

If this attribute as been set, add the corresponding attribute to the DOM element.

dataType()

The subclass of pyxb.binding.basis.simpleTypeDefinition of which any attribute value must be an instance.

defaultValue()

The default value of the attribute.

fixed()

True iff the value of the attribute cannot be changed.

id()

Tag used within Python code for the attribute.

This is not used directly in the default code generation template.

key()

String used as key within object dictionary when storing attribute value.

name()

The expanded name of the element.

Return type:pyxb.namespace.ExpandedName
prohibited()

True iff the attribute must not be assigned a value.

provided(ctd_instance)

True iff the given instance has been explicitly given a value for the attribute.

This is used for things like only generating an XML attribute assignment when a value was originally given (even if that value happens to be the default).

required()

True iff the attribute must be assigned a value.

reset(ctd_instance)

Set the value of the attribute in the given instance to be its default value, and mark that it has not been provided.

set(ctd_instance, new_value, from_xml=False)

Set the value of the attribute.

This validates the value against the data type, creating a new instance if necessary.

Parameters:ctd_instance – The binding instance for which the attribute

value is to be set :type ctd_instance: subclass of pyxb.binding.basis.complexTypeDefinition :param new_value: The value for the attribute :type new_value: Any value that is permitted as the input parameter to the Factory method of the attribute’s datatype. :param from_xml: Value True iff the new_value is known to be in lexical space and must by converted by the type factory. If False (default) the value is only converted if it is not already an instance of the attribute’s underlying type.

validate(ctd_instance)

Validate the instance against the requirements imposed by this attribute use.

There is no return value; calls raise an exception if the content does not validate.

:param ctd_instance : An instance of a complex type definition.

Raises:
  • pyxb.ProhibitedAttributeError – when instance has attribute but must not
  • pyxb.MissingAttributeError – when instance lacks attribute but

must have it (including when a required fixed-value attribute is missing). :raise pyxb.BatchContentValidationError: when instance has attribute but its value is not acceptable

value(ctd_instance)

Get the value of the attribute from the instance.

class pyxb.binding.content.AutomatonConfiguration(instance)

Bases: object

State for a pyxb.utils.fac.Automaton monitoring content for an incrementally constructed complex type binding instance.

Warning:This is not an implementation of

pyxb.utils.fac.Configuration_ABC because we need the step function to return a different type of value.

PermittedNondeterminism = 20

The maximum amount of unresolved non-determinism that is acceptable. If the value is exceeded, a pyxb.ContentNondeterminismExceededError exception will be raised.

_AutomatonConfiguration__cfg = None
_AutomatonConfiguration__discardPreferredSequence(preferred_sequence, pi=None)

Extract non-element content from the sequence and return None.

_AutomatonConfiguration__instance = None
_AutomatonConfiguration__multi = None
_AutomatonConfiguration__pendingNonElementContent = None
_AutomatonConfiguration__preferredPendingSymbol = None
_AutomatonConfiguration__preferredSequenceIndex = 0
_AutomatonConfiguration__processPreferredSequence(preferred_sequence, symbol_set, vc)
_AutomatonConfiguration__resetPreferredSequence(instance)
_diagnoseIncompleteContent(symbols, symbol_set)

Check for incomplete content.

Raises:pyxb.IncompleteElementContentError – if a non-accepting state is found
Returns:the topmost configuration (if accepting)
acceptableContent()

Return the sequence of acceptable symbols at this state.

The list comprises the pyxb.binding.content.ElementUse and pyxb.binding.content.WildcardUse instances that are used to validate proposed symbols, in preferred order.

diagnoseIncompleteContent()

Generate the exception explaining why the content is incomplete.

isAccepting(raise_if_rejecting=False)

Return True iff the automaton is in an accepting state.

If the automaton has unresolved nondeterminism, it is resolved first, preferring accepting states.

nondeterminismCount()

Return the number of pending configurations.

The automaton is deterministic if exactly one configuration is available.

reset()

Reset the automaton to its initial state.

Subsequent transitions are expected based on candidate content to be supplied through the step method.

resolveNondeterminism(prefer_accepting=True)

Resolve any non-determinism in the automaton state.

If the automaton has reached a single configuration (was deterministic), this does nothing.

If multiple candidate configurations are available, the best one is selected and applied, updating the binding instance with the pending content.

“Best” in this case is determined by optionally eliminating configurations that are not accepting, then selecting the path where the initial transition sorts highest using the binding sort key (based on position in the original schema).

Parameters:prefer_accepting – eliminate non-accepting paths if any

accepting path is present.

sequencedChildren()

Implement pyxb.binding.basis.complexTypeDefinition._validatedChildren.

Go there for the interface.

step(value, element_decl)

Attempt a transition from the current state.

Parameters:value – the content to be supplied. For success the value must

be consistent with the recorded symbol (element or wildcard declaration) for a transition from the current automaton state.

Parameters:element_decl – optional

pyxb.binding.content.ElementDeclaration that is the preferred symbol for the transition.

Returns:the cardinal number of successful transitions from the

current configuration based on the parameters.

class pyxb.binding.content.ElementDeclaration(name, id, key, is_plural, location, element_binding=None)

Bases: object

Aggregate the information relevant to an element of a complex type.

This includes the original tag name, the spelling of L{the corresponding object in Python <id>}, an indicator of whether multiple instances might be associated with the field, and other relevant information.

_ElementDeclaration__elementBinding = None
_ElementDeclaration__id = None
_ElementDeclaration__isPlural = False
_ElementDeclaration__key = None
_ElementDeclaration__name = None
_ElementDeclaration__xsdLocation = None
_description(name_only=False, user_documentation=True)
_matches(value, element_decl)
_setElementBinding(element_binding)
append(ctd_instance, value)

Add the given value as another instance of this element within the binding instance. :raise pyxb.StructuralBadDocumentError: invoked on an element use that is not plural

defaultValue()

Return the default value for this element.

For plural values, this is an empty collection. For non-plural values, it is None unless the element has a default value, in which case it is that value.

Todo:This should recursively support filling in default content, as

when the plural list requires a non-zero minimum number of entries.

elementBinding()

The basis.element instance identifying the information associated with the element declaration.

id()

The string name of the binding class field used to hold the element values.

This is the user-visible name, and excepting disambiguation will be equal to the local name of the element.

isPlural()

True iff the content model indicates that more than one element can legitimately belong to this use.

This includes elements in particles with maxOccurs greater than one, and when multiple elements with the same NCName are declared in the same type.

name()

The expanded name of the element.

Return type:pyxb.namespace.ExpandedName
reset(ctd_instance)

Set the value for this use in the given element to its default.

resetValue()

Return the reset value for this element.

For plural values, this is an empty collection. For non-plural values, it is None, corresponding to absence of an assigned element.

set(ctd_instance, value)

Set the value of this element in the given instance.

setOrAppend(ctd_instance, value)

Invoke either set or append, depending on whether the element use is plural.

toDOM(dom_support, parent, value)

Convert the given value to DOM as an instance of this element.

Parameters:
  • dom_support (pyxb.utils.domutils.BindingDOMSupport) – Helper for managing DOM properties
  • parent (xml.dom.Element) – The DOM node within which this element should be generated.
  • value – The content for this element. May be text (if the

element allows mixed content), or an instance of basis._TypeBinding_mixin.

Raises:pyxb.AbstractElementError – the binding to be used is abstract
value(ctd_instance)

Return the value for this use within the given instance.

Note that this is the resetValue(), not the defaultValue(), if the element has not yet been assigned a value.

xsdLocation()

The location in the schema where the element was declared.

Note that this is not necessarily the same location as its use.

class pyxb.binding.content.ElementUse(element_declaration, xsd_location)

Bases: pyxb.binding.content._FACSymbol

Information about a schema element declaration reference.

This is used by the FAC content model to identify the location within a schema at which an element use appears. The ElementDeclaration is not sufficient since multiple uses in various schema, possibly in different namespaces, may refer to the same declaration but be independent uses.

_ElementUse__elementDeclaration = None
consumingClosure(sym)
elementBinding()

Return the element binding associated with the use.

Equivalent to elementDeclaration`().:py:obj:`elementBinding().

elementDeclaration()

Return the element declaration associated with the use.

match(symbol)

Satisfy pyxb.utils.fac.SymbolMatch_mixin.

Determine whether the proposed content encapsulated in symbol is compatible with the element declaration. If so, the accepted value is cached internally and return True; otherwise return False.

Parameters:symbol – a pair (value, element_decl).

pyxb.binding.content.ElementDeclaration._matches is used to determine whether the proposed content is compatible with this element declaration.

matchValue(sym)
typeDefinition()

Return the element type.

Equivalent to elementDeclaration`().:py:obj:`elementBinding().:py:obj:typeDefinition()<pyxb.binding.basis.element.typeDefinition>.

class pyxb.binding.content.Wildcard(*args, **kw)

Bases: object

Placeholder for wildcard objects.

NC_any = '##any'
NC_local = '##local'
NC_not = '##other'
NC_targetNamespace = '##targetNamespace'
PC_lax = 'lax'

Validate against available uniquely determined declaration.

PC_skip = 'skip'

No namespace constraint is applied to the wildcard.

PC_strict = 'strict'

Validate against declaration or xsi:type, which must be available.

_Wildcard__namespaceConstraint = None
_Wildcard__normalizeNamespace(nsv)
_Wildcard__processContents = None
matches(instance, value)

Return True iff the value is a valid match against this wildcard.

Validation per Wildcard allows Namespace Name<http://www.w3.org/TR/xmlschema-1/#cvc-wildcard-namespace>.

namespaceConstraint()

A constraint on the namespace for the wildcard.

Valid values are:

Namespaces are represented by their URIs. Absence is represented by None, both in the “not” pair and in the set.

processContents()

Indicate how this wildcard’s contents should be processed.

class pyxb.binding.content.WildcardUse(wildcard_declaration, xsd_location)

Bases: pyxb.binding.content._FACSymbol

Information about a schema wildcard element.

This is functionally parallel to ElementUse, but references a Wildcard that is unique to this instance. That Wildcard is not incorporated into this class is an artifact of the evolution of PyXB.

_WildcardUse__wildcardDeclaration = None
consumingClosure(sym)

Create a closure that will apply the value accepted by match to a to-be-supplied instance.

match(symbol)

Satisfy pyxb.utils.fac.SymbolMatch_mixin.

Determine whether the proposed content encapsulated in symbol is compatible with the wildcard declaration. If so, the accepted value is cached internally and return True; otherwise return False.

Parameters:symbol – a pair (value, element_decl).

pyxb.binding.content.Wildcard.matches is used to determine whether the proposed content is compatible with this wildcard.

matchValue(sym)
wildcardDeclaration()
class pyxb.binding.content._FACSymbol(xsd_location)

Bases: pyxb.utils.fac.SymbolMatch_mixin

Base class for pyxb.utils.fac.Symbol instances associated with PyXB content models.

This holds the location in the schema of the ElementUse or WildcardUse and documents the methods expected of its children.

_FACSymbol__xsdLocation = None
consumingClosure(sym)

Create a closure that will apply the value from sym to a to-be-supplied instance.

This is necessary for non-deterministic automata, where we can’t store the value into the instance field until we know that the transition will be taken:

Returns:A closure that takes a complexTypeDefinition instance and

stores the value from invoking matchValue on sym into the appropriate slot.

matchValue(sym)

Return the value accepted by match for this symbol.

A match for an element declaration might have resulted in a type change for the value (converting it to an acceptable type). There is no safe place to cache the compatible value calculated in the match while other candidates are being considered, so we need to re-calculate it if the transition is taken.

If the match could not have changed the value, the value from the symbol may be returned immediately.

xsdLocation()
class pyxb.binding.content._PluralBinding(*args, **kw)

Bases: _abcoll.MutableSequence

Helper for element content that supports multiple occurences.

This is an adapter for Python list. Any operation that can mutate an item in the list ensures the stored value is compatible with the element for which the list holds values.

_PluralBinding__convert(v)
_PluralBinding__elementBinding = None
_PluralBinding__list = None
_abc_cache = <_weakrefset.WeakSet object>
_abc_negative_cache = <_weakrefset.WeakSet object>
_abc_negative_cache_version = 164
_abc_registry = <_weakrefset.WeakSet object>
append(x)
count(x)
extend(x)
index(x, i=0, j=-1)
insert(i, x)
pop(i=-1)
remove(x)
reverse()
sort(key=None, reverse=False)

pyxb.binding.datatypes module

Classes supporting XMLSchema Part 2: Datatypes<http://www.w3.org/TR/xmlschema-2/>.

Each simple type definition component instance is paired with at most one basis.simpleTypeDefinition class, which is a subclass of a Python type augmented with facets and other constraining information. This file contains the definitions of these types.

We want the simple datatypes to be efficient Python values, but to also hold specific constraints that don’t apply to the Python types. To do this, we subclass each PST. Primitive PSTs inherit from the Python type that represents them, and from a pyxb.binding.basis.simpleTypeDefinition class which adds in the constraint infrastructure. Derived PSTs inherit from the parent PST.

There is an exception to this when the Python type best suited for a derived SimpleTypeDefinition differs from the type associated with its parent STD: for example, xsd:integer has a value range that requires it be represented by a Python long, but xsd:int allows representation by a Python int. In this case, the derived PST class is structured like a primitive type, but the PST associated with the STD superclass is recorded in a class variable _XsdBaseType.

Note the strict terminology: “datatype” refers to a class which is a subclass of a Python type, while “type definition” refers to an instance of either SimpleTypeDefinition or ComplexTypeDefinition.

class pyxb.binding.datatypes.ENTITIES(*args, **kw)

Bases: pyxb.binding.basis.STD_list

XMLSchema datatype ENTITIES<http:///www.w3.org/TR/xmlschema-2/#ENTITIES>.

_CF_enumeration = <pyxb.binding.facets.CF_enumeration object>
_CF_length = <pyxb.binding.facets.CF_length object>
_CF_maxLength = <pyxb.binding.facets.CF_maxLength object>
_CF_minLength = <pyxb.binding.facets.CF_minLength object>
_CF_pattern = <pyxb.binding.facets.CF_pattern object>
_CF_whiteSpace = <pyxb.binding.facets.CF_whiteSpace object>
_ExpandedName = <pyxb.namespace.ExpandedName object>
_ItemType

alias of ENTITY

_httpwww_w3_org2001XMLSchema_ENTITIES_FacetMap = {<class 'pyxb.binding.facets.CF_length'>: <pyxb.binding.facets.CF_length object>, <class 'pyxb.binding.facets.CF_whiteSpace'>: <pyxb.binding.facets.CF_whiteSpace object>, <class 'pyxb.binding.facets.CF_enumeration'>: <pyxb.binding.facets.CF_enumeration object>, <class 'pyxb.binding.facets.CF_minLength'>: <pyxb.binding.facets.CF_minLength object>, <class 'pyxb.binding.facets.CF_maxLength'>: <pyxb.binding.facets.CF_maxLength object>, <class 'pyxb.binding.facets.CF_pattern'>: <pyxb.binding.facets.CF_pattern object>}
class pyxb.binding.datatypes.ENTITY(*args, **kw)

Bases: pyxb.binding.datatypes.NCName

XMLSchema datatype ENTITY<http:///www.w3.org/TR/xmlschema-2/#ENTITY>.

_ExpandedName = <pyxb.namespace.ExpandedName object>
_httpwww_w3_org2001XMLSchema_ENTITY_FacetMap = {}
class pyxb.binding.datatypes.ID(*args, **kw)

Bases: pyxb.binding.datatypes.NCName

XMLSchema datatype ID<http:///www.w3.org/TR/xmlschema-2/#ID>.

_ExpandedName = <pyxb.namespace.ExpandedName object>
_httpwww_w3_org2001XMLSchema_ID_FacetMap = {}
class pyxb.binding.datatypes.IDREF(*args, **kw)

Bases: pyxb.binding.datatypes.NCName

XMLSchema datatype IDREF<http:///www.w3.org/TR/xmlschema-2/#IDREF>.

_ExpandedName = <pyxb.namespace.ExpandedName object>
_httpwww_w3_org2001XMLSchema_IDREF_FacetMap = {}
class pyxb.binding.datatypes.IDREFS(*args, **kw)

Bases: pyxb.binding.basis.STD_list

XMLSchema datatype IDREFS<http:///www.w3.org/TR/xmlschema-2/#IDREFS>.

_CF_enumeration = <pyxb.binding.facets.CF_enumeration object>
_CF_length = <pyxb.binding.facets.CF_length object>
_CF_maxLength = <pyxb.binding.facets.CF_maxLength object>
_CF_minLength = <pyxb.binding.facets.CF_minLength object>
_CF_pattern = <pyxb.binding.facets.CF_pattern object>
_CF_whiteSpace = <pyxb.binding.facets.CF_whiteSpace object>
_ExpandedName = <pyxb.namespace.ExpandedName object>
_ItemType

alias of IDREF

_httpwww_w3_org2001XMLSchema_IDREFS_FacetMap = {<class 'pyxb.binding.facets.CF_length'>: <pyxb.binding.facets.CF_length object>, <class 'pyxb.binding.facets.CF_whiteSpace'>: <pyxb.binding.facets.CF_whiteSpace object>, <class 'pyxb.binding.facets.CF_enumeration'>: <pyxb.binding.facets.CF_enumeration object>, <class 'pyxb.binding.facets.CF_minLength'>: <pyxb.binding.facets.CF_minLength object>, <class 'pyxb.binding.facets.CF_maxLength'>: <pyxb.binding.facets.CF_maxLength object>, <class 'pyxb.binding.facets.CF_pattern'>: <pyxb.binding.facets.CF_pattern object>}
class pyxb.binding.datatypes.NCName(*args, **kw)

Bases: pyxb.binding.datatypes.Name

XMLSchema datatype NCName<http:///www.w3.org/TR/xmlschema-2/#NCName>.

See http://www.w3.org/TR/1999/REC-xml-names-19990114/#NT-NCName.

_CF_pattern = <pyxb.binding.facets.CF_pattern object>
_ExpandedName = <pyxb.namespace.ExpandedName object>
_ValidRE = <_sre.SRE_Pattern object at 0x3bd73f0>
_httpwww_w3_org2001XMLSchema_NCName_FacetMap = {<class 'pyxb.binding.facets.CF_pattern'>: <pyxb.binding.facets.CF_pattern object>}
class pyxb.binding.datatypes.NMTOKEN(*args, **kw)

Bases: pyxb.binding.datatypes.token

XMLSchema datatype NMTOKEN<http:///www.w3.org/TR/xmlschema-2/#NMTOKEN>.

See http://www.w3.org/TR/2000/WD-xml-2e-20000814.html#NT-Nmtoken.

NMTOKEN is an identifier that can start with any character that is legal in it.

_CF_pattern = <pyxb.binding.facets.CF_pattern object>
_ExpandedName = <pyxb.namespace.ExpandedName object>
_ValidRE = <_sre.SRE_Pattern object at 0x425ff10>
_httpwww_w3_org2001XMLSchema_NMTOKEN_FacetMap = {<class 'pyxb.binding.facets.CF_pattern'>: <pyxb.binding.facets.CF_pattern object>}
class pyxb.binding.datatypes.NMTOKENS(*args, **kw)

Bases: pyxb.binding.basis.STD_list

_CF_enumeration = <pyxb.binding.facets.CF_enumeration object>
_CF_length = <pyxb.binding.facets.CF_length object>
_CF_maxLength = <pyxb.binding.facets.CF_maxLength object>
_CF_minLength = <pyxb.binding.facets.CF_minLength object>
_CF_pattern = <pyxb.binding.facets.CF_pattern object>
_CF_whiteSpace = <pyxb.binding.facets.CF_whiteSpace object>
_ItemType

alias of NMTOKEN

_NMTOKENS_FacetMap = {<class 'pyxb.binding.facets.CF_length'>: <pyxb.binding.facets.CF_length object>, <class 'pyxb.binding.facets.CF_whiteSpace'>: <pyxb.binding.facets.CF_whiteSpace object>, <class 'pyxb.binding.facets.CF_enumeration'>: <pyxb.binding.facets.CF_enumeration object>, <class 'pyxb.binding.facets.CF_minLength'>: <pyxb.binding.facets.CF_minLength object>, <class 'pyxb.binding.facets.CF_maxLength'>: <pyxb.binding.facets.CF_maxLength object>, <class 'pyxb.binding.facets.CF_pattern'>: <pyxb.binding.facets.CF_pattern object>}
class pyxb.binding.datatypes.NOTATION(*args, **kw)

Bases: pyxb.binding.basis.simpleTypeDefinition

XMLSchema datatype NOTATION<http://www.w3.org/TR/xmlschema-2/#NOTATION>.

classmethod XsdValueLength(value)

Section 4.3.1.3: Legacy length return None to indicate no check

_CF_enumeration = <pyxb.binding.facets.CF_enumeration object>
_CF_length = <pyxb.binding.facets.CF_length object>
_CF_maxLength = <pyxb.binding.facets.CF_maxLength object>
_CF_minLength = <pyxb.binding.facets.CF_minLength object>
_CF_pattern = <pyxb.binding.facets.CF_pattern object>
_CF_whiteSpace = <pyxb.binding.facets.CF_whiteSpace object>
_ExpandedName = <pyxb.namespace.ExpandedName object>
_XsdBaseType

alias of anySimpleType

_httpwww_w3_org2001XMLSchema_NOTATION_FacetMap = {<class 'pyxb.binding.facets.CF_length'>: <pyxb.binding.facets.CF_length object>, <class 'pyxb.binding.facets.CF_whiteSpace'>: <pyxb.binding.facets.CF_whiteSpace object>, <class 'pyxb.binding.facets.CF_enumeration'>: <pyxb.binding.facets.CF_enumeration object>, <class 'pyxb.binding.facets.CF_minLength'>: <pyxb.binding.facets.CF_minLength object>, <class 'pyxb.binding.facets.CF_maxLength'>: <pyxb.binding.facets.CF_maxLength object>, <class 'pyxb.binding.facets.CF_pattern'>: <pyxb.binding.facets.CF_pattern object>}
class pyxb.binding.datatypes.Name(*args, **kw)

Bases: pyxb.binding.datatypes.token

XMLSchema datatype Name<http:///www.w3.org/TR/xmlschema-2/#Name>.

See http://www.w3.org/TR/2000/WD-xml-2e-20000814.html#NT-Name.

_CF_pattern = <pyxb.binding.facets.CF_pattern object>
_ExpandedName = <pyxb.namespace.ExpandedName object>
_ValidRE = <_sre.SRE_Pattern object at 0x3bd27a0>
_httpwww_w3_org2001XMLSchema_Name_FacetMap = {<class 'pyxb.binding.facets.CF_pattern'>: <pyxb.binding.facets.CF_pattern object>}
class pyxb.binding.datatypes.QName(*args, **kw)

Bases: pyxb.binding.basis.simpleTypeDefinition, pyxb.namespace.ExpandedName

XMLSchema datatype QName<http://www.w3.org/TR/xmlschema-2/#QName>.

classmethod XsdLiteral(value)
classmethod XsdValueLength(value)

Section 4.3.1.3: Legacy length return None to indicate no check

_CF_enumeration = <pyxb.binding.facets.CF_enumeration object>
_CF_length = <pyxb.binding.facets.CF_length object>
_CF_maxLength = <pyxb.binding.facets.CF_maxLength object>
_CF_minLength = <pyxb.binding.facets.CF_minLength object>
_CF_pattern = <pyxb.binding.facets.CF_pattern object>
_CF_whiteSpace = <pyxb.binding.facets.CF_whiteSpace object>
classmethod _ConvertArguments_vx(args, kw)
classmethod _ConvertIf(value, xmlns_context)
_ExpandedName = <pyxb.namespace.ExpandedName object>
_XsdBaseType

alias of anySimpleType

classmethod _XsdConstraintsPreCheck_vb(value)
_httpwww_w3_org2001XMLSchema_QName_FacetMap = {<class 'pyxb.binding.facets.CF_length'>: <pyxb.binding.facets.CF_length object>, <class 'pyxb.binding.facets.CF_whiteSpace'>: <pyxb.binding.facets.CF_whiteSpace object>, <class 'pyxb.binding.facets.CF_enumeration'>: <pyxb.binding.facets.CF_enumeration object>, <class 'pyxb.binding.facets.CF_minLength'>: <pyxb.binding.facets.CF_minLength object>, <class 'pyxb.binding.facets.CF_maxLength'>: <pyxb.binding.facets.CF_maxLength object>, <class 'pyxb.binding.facets.CF_pattern'>: <pyxb.binding.facets.CF_pattern object>}
class pyxb.binding.datatypes._PyXBDateOnly_base(*args, **kw)

Bases: pyxb.binding.datatypes._PyXBDateTime_base, datetime.datetime

classmethod XsdLiteral(value)
_ValidFields = ('year', 'month', 'day')
_XsdBaseType

alias of anySimpleType

class pyxb.binding.datatypes._PyXBDateTime_base(*args, **kw)

Bases: pyxb.binding.basis.simpleTypeDefinition, pyxb.binding.basis._RepresentAsXsdLiteral_mixin

classmethod XsdLiteral(value)
classmethod _AdjustForTimezone(kw)

Update datetime keywords to account for timezone effects.

All XML schema timezoned times are in UTC, with the time “in its timezone”. If the keywords indicate a non-UTC timezone is in force, and pyxb.PreserveInputTimeZone() has not been set, adjust the values to account for the zone by subtracting the corresponding UTC offset and mark explicitly that the time is in UTC by leaving a tzinfo attribute identifying the UTC time zone.

Parameters:kw – A dictionary of keywords relevant for a date or

time instance. The dictionary is updated by this call.

_DefaultDay = 1
_DefaultMonth = 1
_DefaultYear = 1900
classmethod _LexicalToKeywords(text)
_Lexical_fmt = None

Format for the lexical representation of a date-related instance, excluding timezone.

Subclasses must define this.

_LocalTimeZone = <pyxb.utils.utility.LocalTimeZone object>

A datetime.tzinfo instance representing the local time zone.

_PyXBDateTime_base__LexicalIntegerFields = ('year', 'month', 'day', 'hour', 'minute', 'second')
_PyXBDateTime_base__LexicalREMap = {}
_PyXBDateTime_base__PatternMap = {'%m': '(?P<month>\\d{2})', '%M': '(?P<minute>\\d{2})', '%H': '(?P<hour>\\d{2})', '%d': '(?P<day>\\d{2})', '%Y': '(?P<negYear>-?)(?P<year>\\d{4,})', '%Z': '(?P<tzinfo>Z|[-+]\\d\\d:\\d\\d)', '%S': '(?P<second>\\d{2})(?P<fracsec>\\.\\d+)?'}
classmethod _SetKeysFromPython(python_value, kw, fields)
classmethod _SetKeysFromPython_csc(python_value, kw, fields)
_UTCTimeZone = <pyxb.utils.utility.UTCOffsetTimeZone object>

A datetime.tzinfo instance representing UTC.

class pyxb.binding.datatypes._fp(*args, **kw)

Bases: pyxb.binding.basis.simpleTypeDefinition, float, pyxb.binding.basis._NoNullaryNonNillableNew_mixin

classmethod XsdLiteral(value)
_XsdBaseType

alias of anySimpleType

class pyxb.binding.datatypes.anySimpleType(*args, **kw)

Bases: pyxb.binding.basis.simpleTypeDefinition, unicode

XMLSchema datatype anySimpleType<http://www.w3.org/TR/xmlschema-2/#dt-anySimpleType>.

classmethod XsdLiteral(value)
_ExpandedName = <pyxb.namespace.ExpandedName object>
_XsdBaseType = None
class pyxb.binding.datatypes.anyType(*args, **kw)

Bases: pyxb.binding.basis.complexTypeDefinition

XMLSchema datatype anyType<http://www.w3.org/TR/2001/REC-xmlschema-1-20010502/#key-urType>.

_Abstract = False
_AttributeWildcard = <pyxb.binding.content.Wildcard object>
_Automaton = <pyxb.utils.fac.Automaton object>
_ContentTypeTag = 'MIXED'
_DefinitionLocation = pyxb.utils.utility.Location('http://www.w3.org/TR/2001/REC-xmlschema-1-20010502/#key-urType', 1, 1)
_ExpandedName = <pyxb.namespace.ExpandedName object>
_HasWildcardElement = True
classmethod _IsUrType(_c)
class pyxb.binding.datatypes.anyURI(*args, **kw)

Bases: pyxb.binding.basis.simpleTypeDefinition, unicode

XMLSchema datatype anyURI<http://www.w3.org/TR/xmlschema-2/#anyURI>.

classmethod XsdLiteral(value)
classmethod XsdValueLength(value)
_CF_enumeration = <pyxb.binding.facets.CF_enumeration object>
_CF_length = <pyxb.binding.facets.CF_length object>
_CF_maxLength = <pyxb.binding.facets.CF_maxLength object>
_CF_minLength = <pyxb.binding.facets.CF_minLength object>
_CF_pattern = <pyxb.binding.facets.CF_pattern object>
_CF_whiteSpace = <pyxb.binding.facets.CF_whiteSpace object>
_ExpandedName = <pyxb.namespace.ExpandedName object>
_XsdBaseType

alias of anySimpleType

_httpwww_w3_org2001XMLSchema_anyURI_FacetMap = {<class 'pyxb.binding.facets.CF_length'>: <pyxb.binding.facets.CF_length object>, <class 'pyxb.binding.facets.CF_whiteSpace'>: <pyxb.binding.facets.CF_whiteSpace object>, <class 'pyxb.binding.facets.CF_enumeration'>: <pyxb.binding.facets.CF_enumeration object>, <class 'pyxb.binding.facets.CF_minLength'>: <pyxb.binding.facets.CF_minLength object>, <class 'pyxb.binding.facets.CF_maxLength'>: <pyxb.binding.facets.CF_maxLength object>, <class 'pyxb.binding.facets.CF_pattern'>: <pyxb.binding.facets.CF_pattern object>}
class pyxb.binding.datatypes.base64Binary(*args, **kw)

Bases: pyxb.binding.basis.simpleTypeDefinition, str

XMLSchema datatype base64Binary<http://www.w3.org/TR/xmlschema-2/#base64Binary>.

See also RFC2045<http://tools.ietf.org/html/rfc2045> and RFC4648<http://tools.ietf.org/html/rfc4648>.

classmethod XsdLiteral(value)
classmethod XsdValidateLength(length)

Control the maximum encoded size that is checked for XML literal validity.

Python’s base64 module allows some literals that are invalid according to XML rules. PyXB verifies the validity using a regular expression, which is costly for something that is unlikely to occur. Use this function to inhibit checks for validity based on the length of the XML literal.

Parameters:lengthNone (default) to check all literals,

otherwise the maximum length literal that will be checked. Pass -1 to disable the validity check.

Returns:the previous validation length
classmethod XsdValueLength(value)
_B04 = '[AQgw]'
_B04S = '([AQgw] ?)'
_B16 = '[AEIMQUYcgkosw048]'
_B16S = '([AEIMQUYcgkosw048] ?)'
_B64 = '[ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/]'
_B64S = '([ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/] ?)'
_CF_enumeration = <pyxb.binding.facets.CF_enumeration object>
_CF_length = <pyxb.binding.facets.CF_length object>
_CF_maxLength = <pyxb.binding.facets.CF_maxLength object>
_CF_minLength = <pyxb.binding.facets.CF_minLength object>
_CF_pattern = <pyxb.binding.facets.CF_pattern object>
_CF_whiteSpace = <pyxb.binding.facets.CF_whiteSpace object>
classmethod _ConvertArguments_vx(args, kw)
_ExpandedName = <pyxb.namespace.ExpandedName object>
_XsdBaseType

alias of anySimpleType

_base64Binary__Lexical_re = <_sre.SRE_Pattern object at 0x3d09cd0>
_base64Binary__Pattern = '^((([ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/] ?){4})*((([ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/] ?){3}[ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/])|(([ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/] ?){2}([AEIMQUYcgkosw048] ?)=)|(([ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/] ?)([AQgw] ?)= ?=)))?$'
_base64Binary__ValidateLength = None
_httpwww_w3_org2001XMLSchema_base64Binary_FacetMap = {<class 'pyxb.binding.facets.CF_length'>: <pyxb.binding.facets.CF_length object>, <class 'pyxb.binding.facets.CF_whiteSpace'>: <pyxb.binding.facets.CF_whiteSpace object>, <class 'pyxb.binding.facets.CF_enumeration'>: <pyxb.binding.facets.CF_enumeration object>, <class 'pyxb.binding.facets.CF_minLength'>: <pyxb.binding.facets.CF_minLength object>, <class 'pyxb.binding.facets.CF_maxLength'>: <pyxb.binding.facets.CF_maxLength object>, <class 'pyxb.binding.facets.CF_pattern'>: <pyxb.binding.facets.CF_pattern object>}
class pyxb.binding.datatypes.boolean(*args, **kw)

Bases: pyxb.binding.basis.simpleTypeDefinition, int, pyxb.binding.basis._NoNullaryNonNillableNew_mixin

XMLSchema datatype boolean<http://www.w3.org/TR/xmlschema-2/#boolean>.

classmethod XsdLiteral(value)
_CF_pattern = <pyxb.binding.facets.CF_pattern object>
_CF_whiteSpace = <pyxb.binding.facets.CF_whiteSpace object>
_ExpandedName = <pyxb.namespace.ExpandedName object>
_XsdBaseType

alias of anySimpleType

_httpwww_w3_org2001XMLSchema_boolean_FacetMap = {<class 'pyxb.binding.facets.CF_whiteSpace'>: <pyxb.binding.facets.CF_whiteSpace object>, <class 'pyxb.binding.facets.CF_pattern'>: <pyxb.binding.facets.CF_pattern object>}
class pyxb.binding.datatypes.byte(*args, **kw)

Bases: pyxb.binding.datatypes.short

XMLSchema datatype byte<http://www.w3.org/TR/xmlschema-2/#byte>.

_CF_maxInclusive = <pyxb.binding.facets.CF_maxInclusive object>
_CF_minInclusive = <pyxb.binding.facets.CF_minInclusive object>
_ExpandedName = <pyxb.namespace.ExpandedName object>
_httpwww_w3_org2001XMLSchema_byte_FacetMap = {<class 'pyxb.binding.facets.CF_minInclusive'>: <pyxb.binding.facets.CF_minInclusive object>, <class 'pyxb.binding.facets.CF_maxInclusive'>: <pyxb.binding.facets.CF_maxInclusive object>}
class pyxb.binding.datatypes.date(*args, **kw)

Bases: pyxb.binding.datatypes._PyXBDateOnly_base

XMLSchema datatype date<http://www.w3.org/TR/xmlschema-2/#date>.

This class uses the Python datetime.datetime class as its underlying representation; fields not relevant to this type are derived from 1900-01-01T00:00:00.

Note:Unlike dateTime, timezoned date values are not converted

to UTC. The provided timezone information is retained along with the instance; however, the lexical representation generated for output is canonicalized (timezones no more than 12 hours off UTC).

classmethod XsdLiteral(value)
_CF_enumeration = <pyxb.binding.facets.CF_enumeration object>
_CF_maxExclusive = <pyxb.binding.facets.CF_maxExclusive object>
_CF_maxInclusive = <pyxb.binding.facets.CF_maxInclusive object>
_CF_minExclusive = <pyxb.binding.facets.CF_minExclusive object>
_CF_minInclusive = <pyxb.binding.facets.CF_minInclusive object>
_CF_pattern = <pyxb.binding.facets.CF_pattern object>
_CF_whiteSpace = <pyxb.binding.facets.CF_whiteSpace object>
_ExpandedName = <pyxb.namespace.ExpandedName object>
_Fields = ('year', 'month', 'day')
_Lexical_fmt = '%Y-%m-%d'
_date__MinutesPerDay = 1440
_date__MinutesPerHalfDay = 720
_date__SecondsPerMinute = 60
_httpwww_w3_org2001XMLSchema_date_FacetMap = {<class 'pyxb.binding.facets.CF_maxExclusive'>: <pyxb.binding.facets.CF_maxExclusive object>, <class 'pyxb.binding.facets.CF_minExclusive'>: <pyxb.binding.facets.CF_minExclusive object>, <class 'pyxb.binding.facets.CF_minInclusive'>: <pyxb.binding.facets.CF_minInclusive object>, <class 'pyxb.binding.facets.CF_maxInclusive'>: <pyxb.binding.facets.CF_maxInclusive object>, <class 'pyxb.binding.facets.CF_whiteSpace'>: <pyxb.binding.facets.CF_whiteSpace object>, <class 'pyxb.binding.facets.CF_enumeration'>: <pyxb.binding.facets.CF_enumeration object>, <class 'pyxb.binding.facets.CF_pattern'>: <pyxb.binding.facets.CF_pattern object>}
xsdRecoverableTzinfo()

Return the recoverable tzinfo for the date.

Return a pyxb.utils.utility.UTCOffsetTimeZone instance reflecting the timezone associated with the date, or None if the date is not timezoned.

Note:This is not the recoverable timezone, because timezones are

represented as timedeltas which get normalized in ways that don’t match what we expect for a tzinfo.

class pyxb.binding.datatypes.dateTime(*args, **kw)

Bases: pyxb.binding.datatypes._PyXBDateTime_base, datetime.datetime

XMLSchema datatype dateTime<http://www.w3.org/TR/xmlschema-2/#dateTime>.

This class uses the Python datetime.datetime class as its underlying representation. Unless pyxb.PreserveInputTimeZone() is used, all timezoned dateTime objects are in UTC. Presence of time zone information in the lexical space is preserved by a non-empty tzinfo field, which should always be zero minutes offset from UTC unless the input time zone was preserved.

Warning:The value space of Python’s datetime.datetime class

is more restricted than that of xs:datetime. As a specific example, Python does not support negative years or years with more than four digits. For now, the convenience of having an object that is compatible with Python is more important than supporting the full value space. In the future, the choice may be left up to the developer.

_CF_enumeration = <pyxb.binding.facets.CF_enumeration object>
_CF_maxExclusive = <pyxb.binding.facets.CF_maxExclusive object>
_CF_maxInclusive = <pyxb.binding.facets.CF_maxInclusive object>
_CF_minExclusive = <pyxb.binding.facets.CF_minExclusive object>
_CF_minInclusive = <pyxb.binding.facets.CF_minInclusive object>
_CF_pattern = <pyxb.binding.facets.CF_pattern object>
_CF_whiteSpace = <pyxb.binding.facets.CF_whiteSpace object>
_ExpandedName = <pyxb.namespace.ExpandedName object>
_Lexical_fmt = '%Y-%m-%dT%H:%M:%S'
_XsdBaseType

alias of anySimpleType

_dateTime__CtorFields = ('year', 'month', 'day', 'hour', 'minute', 'second', 'microsecond', 'tzinfo')
_httpwww_w3_org2001XMLSchema_dateTime_FacetMap = {<class 'pyxb.binding.facets.CF_maxExclusive'>: <pyxb.binding.facets.CF_maxExclusive object>, <class 'pyxb.binding.facets.CF_minExclusive'>: <pyxb.binding.facets.CF_minExclusive object>, <class 'pyxb.binding.facets.CF_minInclusive'>: <pyxb.binding.facets.CF_minInclusive object>, <class 'pyxb.binding.facets.CF_maxInclusive'>: <pyxb.binding.facets.CF_maxInclusive object>, <class 'pyxb.binding.facets.CF_whiteSpace'>: <pyxb.binding.facets.CF_whiteSpace object>, <class 'pyxb.binding.facets.CF_enumeration'>: <pyxb.binding.facets.CF_enumeration object>, <class 'pyxb.binding.facets.CF_pattern'>: <pyxb.binding.facets.CF_pattern object>}
aslocal()

Returns a datetime.datetime instance denoting the same time as this instance but adjusted to be in the local time zone.

Return type:datetime.datetime (B{NOT} xsd.dateTime)
classmethod today()

Return today.

Just like datetime.datetime.today(), except this one sets a tzinfo field so it’s clear the value is UTC.

class pyxb.binding.datatypes.decimal(*args, **kw)

Bases: pyxb.binding.basis.simpleTypeDefinition, decimal.Decimal, pyxb.binding.basis._RepresentAsXsdLiteral_mixin, pyxb.binding.basis._NoNullaryNonNillableNew_mixin

XMLSchema datatype decimal<http://www.w3.org/TR/xmlschema-2/#decimal>.

This class uses Python’s decimal.Decimal class to support (by default) 28 significant digits. Only normal and zero values are valid; this means NaN and Infinity may be created during calculations, but cannot be expressed in XML documents.

classmethod XsdLiteral(value)
_CF_enumeration = <pyxb.binding.facets.CF_enumeration object>
_CF_fractionDigits = <pyxb.binding.facets.CF_fractionDigits object>
_CF_maxExclusive = <pyxb.binding.facets.CF_maxExclusive object>
_CF_maxInclusive = <pyxb.binding.facets.CF_maxInclusive object>
_CF_minExclusive = <pyxb.binding.facets.CF_minExclusive object>
_CF_minInclusive = <pyxb.binding.facets.CF_minInclusive object>
_CF_pattern = <pyxb.binding.facets.CF_pattern object>
_CF_totalDigits = <pyxb.binding.facets.CF_totalDigits object>
_CF_whiteSpace = <pyxb.binding.facets.CF_whiteSpace object>
classmethod _CheckValidValue(value)
_ExpandedName = <pyxb.namespace.ExpandedName object>
_XsdBaseType

alias of anySimpleType

_httpwww_w3_org2001XMLSchema_decimal_FacetMap = {<class 'pyxb.binding.facets.CF_totalDigits'>: <pyxb.binding.facets.CF_totalDigits object>, <class 'pyxb.binding.facets.CF_maxExclusive'>: <pyxb.binding.facets.CF_maxExclusive object>, <class 'pyxb.binding.facets.CF_minExclusive'>: <pyxb.binding.facets.CF_minExclusive object>, <class 'pyxb.binding.facets.CF_minInclusive'>: <pyxb.binding.facets.CF_minInclusive object>, <class 'pyxb.binding.facets.CF_maxInclusive'>: <pyxb.binding.facets.CF_maxInclusive object>, <class 'pyxb.binding.facets.CF_whiteSpace'>: <pyxb.binding.facets.CF_whiteSpace object>, <class 'pyxb.binding.facets.CF_enumeration'>: <pyxb.binding.facets.CF_enumeration object>, <class 'pyxb.binding.facets.CF_fractionDigits'>: <pyxb.binding.facets.CF_fractionDigits object>, <class 'pyxb.binding.facets.CF_pattern'>: <pyxb.binding.facets.CF_pattern object>}
class pyxb.binding.datatypes.double(*args, **kw)

Bases: pyxb.binding.datatypes._fp

XMLSchema datatype double<http://www.w3.org/TR/xmlschema-2/#double>.

_CF_enumeration = <pyxb.binding.facets.CF_enumeration object>
_CF_maxExclusive = <pyxb.binding.facets.CF_maxExclusive object>
_CF_maxInclusive = <pyxb.binding.facets.CF_maxInclusive object>
_CF_minExclusive = <pyxb.binding.facets.CF_minExclusive object>
_CF_minInclusive = <pyxb.binding.facets.CF_minInclusive object>
_CF_pattern = <pyxb.binding.facets.CF_pattern object>
_CF_whiteSpace = <pyxb.binding.facets.CF_whiteSpace object>
_ExpandedName = <pyxb.namespace.ExpandedName object>
_httpwww_w3_org2001XMLSchema_double_FacetMap = {<class 'pyxb.binding.facets.CF_maxExclusive'>: <pyxb.binding.facets.CF_maxExclusive object>, <class 'pyxb.binding.facets.CF_minExclusive'>: <pyxb.binding.facets.CF_minExclusive object>, <class 'pyxb.binding.facets.CF_minInclusive'>: <pyxb.binding.facets.CF_minInclusive object>, <class 'pyxb.binding.facets.CF_maxInclusive'>: <pyxb.binding.facets.CF_maxInclusive object>, <class 'pyxb.binding.facets.CF_whiteSpace'>: <pyxb.binding.facets.CF_whiteSpace object>, <class 'pyxb.binding.facets.CF_enumeration'>: <pyxb.binding.facets.CF_enumeration object>, <class 'pyxb.binding.facets.CF_pattern'>: <pyxb.binding.facets.CF_pattern object>}
class pyxb.binding.datatypes.duration(*args, **kw)

Bases: pyxb.binding.basis.simpleTypeDefinition, datetime.timedelta, pyxb.binding.basis._RepresentAsXsdLiteral_mixin

XMLSchema datatype duration<http://www.w3.org/TR/xmlschema-2/#duration>.

This class uses the Python datetime.timedelta class as its underlying representation. This works fine as long as no months or years are involved, and no negative durations are involved. Because the XML Schema value space is so much larger, it is kept distinct from the Python value space, which reduces to integral days, seconds, and microseconds.

In other words, the implementation of this type is a little shakey.

classmethod XsdLiteral(value)
_CF_enumeration = <pyxb.binding.facets.CF_enumeration object>
_CF_maxExclusive = <pyxb.binding.facets.CF_maxExclusive object>
_CF_maxInclusive = <pyxb.binding.facets.CF_maxInclusive object>
_CF_minExclusive = <pyxb.binding.facets.CF_minExclusive object>
_CF_minInclusive = <pyxb.binding.facets.CF_minInclusive object>
_CF_pattern = <pyxb.binding.facets.CF_pattern object>
_CF_whiteSpace = <pyxb.binding.facets.CF_whiteSpace object>
_ExpandedName = <pyxb.namespace.ExpandedName object>
_XsdBaseType

alias of anySimpleType

_duration__Lexical_re = <_sre.SRE_Pattern object at 0x4217950>
_duration__PythonFields = ('days', 'seconds', 'microseconds', 'minutes', 'hours')
_duration__XSDFields = ('years', 'months', 'days', 'hours', 'minutes', 'seconds')
_duration__durationData = None
_duration__negativeDuration = None
_httpwww_w3_org2001XMLSchema_duration_FacetMap = {<class 'pyxb.binding.facets.CF_maxExclusive'>: <pyxb.binding.facets.CF_maxExclusive object>, <class 'pyxb.binding.facets.CF_minExclusive'>: <pyxb.binding.facets.CF_minExclusive object>, <class 'pyxb.binding.facets.CF_minInclusive'>: <pyxb.binding.facets.CF_minInclusive object>, <class 'pyxb.binding.facets.CF_maxInclusive'>: <pyxb.binding.facets.CF_maxInclusive object>, <class 'pyxb.binding.facets.CF_whiteSpace'>: <pyxb.binding.facets.CF_whiteSpace object>, <class 'pyxb.binding.facets.CF_enumeration'>: <pyxb.binding.facets.CF_enumeration object>, <class 'pyxb.binding.facets.CF_pattern'>: <pyxb.binding.facets.CF_pattern object>}
durationData()
negativeDuration()
class pyxb.binding.datatypes.float(*args, **kw)

Bases: pyxb.binding.datatypes._fp

XMLSchema datatype float<http://www.w3.org/TR/xmlschema-2/#float>.

_CF_enumeration = <pyxb.binding.facets.CF_enumeration object>
_CF_maxExclusive = <pyxb.binding.facets.CF_maxExclusive object>
_CF_maxInclusive = <pyxb.binding.facets.CF_maxInclusive object>
_CF_minExclusive = <pyxb.binding.facets.CF_minExclusive object>
_CF_minInclusive = <pyxb.binding.facets.CF_minInclusive object>
_CF_pattern = <pyxb.binding.facets.CF_pattern object>
_CF_whiteSpace = <pyxb.binding.facets.CF_whiteSpace object>
_ExpandedName = <pyxb.namespace.ExpandedName object>
_httpwww_w3_org2001XMLSchema_float_FacetMap = {<class 'pyxb.binding.facets.CF_maxExclusive'>: <pyxb.binding.facets.CF_maxExclusive object>, <class 'pyxb.binding.facets.CF_minExclusive'>: <pyxb.binding.facets.CF_minExclusive object>, <class 'pyxb.binding.facets.CF_minInclusive'>: <pyxb.binding.facets.CF_minInclusive object>, <class 'pyxb.binding.facets.CF_maxInclusive'>: <pyxb.binding.facets.CF_maxInclusive object>, <class 'pyxb.binding.facets.CF_whiteSpace'>: <pyxb.binding.facets.CF_whiteSpace object>, <class 'pyxb.binding.facets.CF_enumeration'>: <pyxb.binding.facets.CF_enumeration object>, <class 'pyxb.binding.facets.CF_pattern'>: <pyxb.binding.facets.CF_pattern object>}
class pyxb.binding.datatypes.gDay(*args, **kw)

Bases: pyxb.binding.datatypes._PyXBDateOnly_base

XMLSchema datatype gDay<http://www.w3.org/TR/xmlschema-2/#gDay>.

This class uses the Python datetime.datetime class as its underlying representation; fields not relevant to this type are derived from 1900-01-01T00:00:00.

_CF_enumeration = <pyxb.binding.facets.CF_enumeration object>
_CF_maxExclusive = <pyxb.binding.facets.CF_maxExclusive object>
_CF_maxInclusive = <pyxb.binding.facets.CF_maxInclusive object>
_CF_minExclusive = <pyxb.binding.facets.CF_minExclusive object>
_CF_minInclusive = <pyxb.binding.facets.CF_minInclusive object>
_CF_pattern = <pyxb.binding.facets.CF_pattern object>
_CF_whiteSpace = <pyxb.binding.facets.CF_whiteSpace object>
_ExpandedName = <pyxb.namespace.ExpandedName object>
_Lexical_fmt = '---%d'
_ValidFields = ('day',)
_httpwww_w3_org2001XMLSchema_gDay_FacetMap = {<class 'pyxb.binding.facets.CF_maxExclusive'>: <pyxb.binding.facets.CF_maxExclusive object>, <class 'pyxb.binding.facets.CF_minExclusive'>: <pyxb.binding.facets.CF_minExclusive object>, <class 'pyxb.binding.facets.CF_minInclusive'>: <pyxb.binding.facets.CF_minInclusive object>, <class 'pyxb.binding.facets.CF_maxInclusive'>: <pyxb.binding.facets.CF_maxInclusive object>, <class 'pyxb.binding.facets.CF_whiteSpace'>: <pyxb.binding.facets.CF_whiteSpace object>, <class 'pyxb.binding.facets.CF_enumeration'>: <pyxb.binding.facets.CF_enumeration object>, <class 'pyxb.binding.facets.CF_pattern'>: <pyxb.binding.facets.CF_pattern object>}
class pyxb.binding.datatypes.gMonth(*args, **kw)

Bases: pyxb.binding.datatypes._PyXBDateOnly_base

XMLSchema datatype gMonth<http://www.w3.org/TR/xmlschema-2/#gMonth>.

This class uses the Python datetime.datetime class as its underlying representation; fields not relevant to this type are derived from 1900-01-01T00:00:00.

_CF_enumeration = <pyxb.binding.facets.CF_enumeration object>
_CF_maxExclusive = <pyxb.binding.facets.CF_maxExclusive object>
_CF_maxInclusive = <pyxb.binding.facets.CF_maxInclusive object>
_CF_minExclusive = <pyxb.binding.facets.CF_minExclusive object>
_CF_minInclusive = <pyxb.binding.facets.CF_minInclusive object>
_CF_pattern = <pyxb.binding.facets.CF_pattern object>
_CF_whiteSpace = <pyxb.binding.facets.CF_whiteSpace object>
_ExpandedName = <pyxb.namespace.ExpandedName object>
_Lexical_fmt = '--%m'
_ValidFields = ('month',)
_httpwww_w3_org2001XMLSchema_gMonth_FacetMap = {<class 'pyxb.binding.facets.CF_maxExclusive'>: <pyxb.binding.facets.CF_maxExclusive object>, <class 'pyxb.binding.facets.CF_minExclusive'>: <pyxb.binding.facets.CF_minExclusive object>, <class 'pyxb.binding.facets.CF_minInclusive'>: <pyxb.binding.facets.CF_minInclusive object>, <class 'pyxb.binding.facets.CF_maxInclusive'>: <pyxb.binding.facets.CF_maxInclusive object>, <class 'pyxb.binding.facets.CF_whiteSpace'>: <pyxb.binding.facets.CF_whiteSpace object>, <class 'pyxb.binding.facets.CF_enumeration'>: <pyxb.binding.facets.CF_enumeration object>, <class 'pyxb.binding.facets.CF_pattern'>: <pyxb.binding.facets.CF_pattern object>}
class pyxb.binding.datatypes.gMonthDay(*args, **kw)

Bases: pyxb.binding.datatypes._PyXBDateOnly_base

XMLSchema datatype gMonthDay<http://www.w3.org/TR/xmlschema-2/#gMonthDay>.

This class uses the Python datetime.datetime class as its underlying representation; fields not relevant to this type are derived from 1900-01-01T00:00:00.

_CF_enumeration = <pyxb.binding.facets.CF_enumeration object>
_CF_maxExclusive = <pyxb.binding.facets.CF_maxExclusive object>
_CF_maxInclusive = <pyxb.binding.facets.CF_maxInclusive object>
_CF_minExclusive = <pyxb.binding.facets.CF_minExclusive object>
_CF_minInclusive = <pyxb.binding.facets.CF_minInclusive object>
_CF_pattern = <pyxb.binding.facets.CF_pattern object>
_CF_whiteSpace = <pyxb.binding.facets.CF_whiteSpace object>
_ExpandedName = <pyxb.namespace.ExpandedName object>
_Lexical_fmt = '--%m-%d'
_ValidFields = ('month', 'day')
_httpwww_w3_org2001XMLSchema_gMonthDay_FacetMap = {<class 'pyxb.binding.facets.CF_maxExclusive'>: <pyxb.binding.facets.CF_maxExclusive object>, <class 'pyxb.binding.facets.CF_minExclusive'>: <pyxb.binding.facets.CF_minExclusive object>, <class 'pyxb.binding.facets.CF_minInclusive'>: <pyxb.binding.facets.CF_minInclusive object>, <class 'pyxb.binding.facets.CF_maxInclusive'>: <pyxb.binding.facets.CF_maxInclusive object>, <class 'pyxb.binding.facets.CF_whiteSpace'>: <pyxb.binding.facets.CF_whiteSpace object>, <class 'pyxb.binding.facets.CF_enumeration'>: <pyxb.binding.facets.CF_enumeration object>, <class 'pyxb.binding.facets.CF_pattern'>: <pyxb.binding.facets.CF_pattern object>}
class pyxb.binding.datatypes.gYear(*args, **kw)

Bases: pyxb.binding.datatypes._PyXBDateOnly_base

XMLSchema datatype gYear<http://www.w3.org/TR/xmlschema-2/#gYear>.

This class uses the Python datetime.datetime class as its underlying representation; fields not relevant to this type are derived from 1900-01-01T00:00:00.

_CF_enumeration = <pyxb.binding.facets.CF_enumeration object>
_CF_maxExclusive = <pyxb.binding.facets.CF_maxExclusive object>
_CF_maxInclusive = <pyxb.binding.facets.CF_maxInclusive object>
_CF_minExclusive = <pyxb.binding.facets.CF_minExclusive object>
_CF_minInclusive = <pyxb.binding.facets.CF_minInclusive object>
_CF_pattern = <pyxb.binding.facets.CF_pattern object>
_CF_whiteSpace = <pyxb.binding.facets.CF_whiteSpace object>
_ExpandedName = <pyxb.namespace.ExpandedName object>
_Lexical_fmt = '%Y'
_ValidFields = ('year',)
_httpwww_w3_org2001XMLSchema_gYear_FacetMap = {<class 'pyxb.binding.facets.CF_maxExclusive'>: <pyxb.binding.facets.CF_maxExclusive object>, <class 'pyxb.binding.facets.CF_minExclusive'>: <pyxb.binding.facets.CF_minExclusive object>, <class 'pyxb.binding.facets.CF_minInclusive'>: <pyxb.binding.facets.CF_minInclusive object>, <class 'pyxb.binding.facets.CF_maxInclusive'>: <pyxb.binding.facets.CF_maxInclusive object>, <class 'pyxb.binding.facets.CF_whiteSpace'>: <pyxb.binding.facets.CF_whiteSpace object>, <class 'pyxb.binding.facets.CF_enumeration'>: <pyxb.binding.facets.CF_enumeration object>, <class 'pyxb.binding.facets.CF_pattern'>: <pyxb.binding.facets.CF_pattern object>}
class pyxb.binding.datatypes.gYearMonth(*args, **kw)

Bases: pyxb.binding.datatypes._PyXBDateOnly_base

XMLSchema datatype gYearMonth<http://www.w3.org/TR/xmlschema-2/#gYearMonth>.

This class uses the Python datetime.datetime class as its underlying representation; fields not relevant to this type are derived from 1900-01-01T00:00:00.

_CF_enumeration = <pyxb.binding.facets.CF_enumeration object>
_CF_maxExclusive = <pyxb.binding.facets.CF_maxExclusive object>
_CF_maxInclusive = <pyxb.binding.facets.CF_maxInclusive object>
_CF_minExclusive = <pyxb.binding.facets.CF_minExclusive object>
_CF_minInclusive = <pyxb.binding.facets.CF_minInclusive object>
_CF_pattern = <pyxb.binding.facets.CF_pattern object>
_CF_whiteSpace = <pyxb.binding.facets.CF_whiteSpace object>
_ExpandedName = <pyxb.namespace.ExpandedName object>
_Lexical_fmt = '%Y-%m'
_ValidFields = ('year', 'month')
_httpwww_w3_org2001XMLSchema_gYearMonth_FacetMap = {<class 'pyxb.binding.facets.CF_maxExclusive'>: <pyxb.binding.facets.CF_maxExclusive object>, <class 'pyxb.binding.facets.CF_minExclusive'>: <pyxb.binding.facets.CF_minExclusive object>, <class 'pyxb.binding.facets.CF_minInclusive'>: <pyxb.binding.facets.CF_minInclusive object>, <class 'pyxb.binding.facets.CF_maxInclusive'>: <pyxb.binding.facets.CF_maxInclusive object>, <class 'pyxb.binding.facets.CF_whiteSpace'>: <pyxb.binding.facets.CF_whiteSpace object>, <class 'pyxb.binding.facets.CF_enumeration'>: <pyxb.binding.facets.CF_enumeration object>, <class 'pyxb.binding.facets.CF_pattern'>: <pyxb.binding.facets.CF_pattern object>}
class pyxb.binding.datatypes.hexBinary(*args, **kw)

Bases: pyxb.binding.basis.simpleTypeDefinition, str

XMLSchema datatype hexBinary<http://www.w3.org/TR/xmlschema-2/#hexBinary>.

classmethod XsdLiteral(value)
classmethod XsdValueLength(value)
_CF_enumeration = <pyxb.binding.facets.CF_enumeration object>
_CF_length = <pyxb.binding.facets.CF_length object>
_CF_maxLength = <pyxb.binding.facets.CF_maxLength object>
_CF_minLength = <pyxb.binding.facets.CF_minLength object>
_CF_pattern = <pyxb.binding.facets.CF_pattern object>
_CF_whiteSpace = <pyxb.binding.facets.CF_whiteSpace object>
classmethod _ConvertArguments_vx(args, kw)
_ExpandedName = <pyxb.namespace.ExpandedName object>
_XsdBaseType

alias of anySimpleType

_httpwww_w3_org2001XMLSchema_hexBinary_FacetMap = {<class 'pyxb.binding.facets.CF_length'>: <pyxb.binding.facets.CF_length object>, <class 'pyxb.binding.facets.CF_whiteSpace'>: <pyxb.binding.facets.CF_whiteSpace object>, <class 'pyxb.binding.facets.CF_enumeration'>: <pyxb.binding.facets.CF_enumeration object>, <class 'pyxb.binding.facets.CF_minLength'>: <pyxb.binding.facets.CF_minLength object>, <class 'pyxb.binding.facets.CF_maxLength'>: <pyxb.binding.facets.CF_maxLength object>, <class 'pyxb.binding.facets.CF_pattern'>: <pyxb.binding.facets.CF_pattern object>}
class pyxb.binding.datatypes.int(*args, **kw)

Bases: pyxb.binding.basis.simpleTypeDefinition, int, pyxb.binding.basis._NoNullaryNonNillableNew_mixin

XMLSchema datatype int<http://www.w3.org/TR/xmlschema-2/#int>.

classmethod XsdLiteral(value)
_CF_maxInclusive = <pyxb.binding.facets.CF_maxInclusive object>
_CF_minInclusive = <pyxb.binding.facets.CF_minInclusive object>
_ExpandedName = <pyxb.namespace.ExpandedName object>
_XsdBaseType

alias of long

_httpwww_w3_org2001XMLSchema_int_FacetMap = {<class 'pyxb.binding.facets.CF_totalDigits'>: <pyxb.binding.facets.CF_totalDigits object>, <class 'pyxb.binding.facets.CF_maxExclusive'>: <pyxb.binding.facets.CF_maxExclusive object>, <class 'pyxb.binding.facets.CF_minExclusive'>: <pyxb.binding.facets.CF_minExclusive object>, <class 'pyxb.binding.facets.CF_minInclusive'>: <pyxb.binding.facets.CF_minInclusive object>, <class 'pyxb.binding.facets.CF_maxInclusive'>: <pyxb.binding.facets.CF_maxInclusive object>, <class 'pyxb.binding.facets.CF_whiteSpace'>: <pyxb.binding.facets.CF_whiteSpace object>, <class 'pyxb.binding.facets.CF_enumeration'>: <pyxb.binding.facets.CF_enumeration object>, <class 'pyxb.binding.facets.CF_fractionDigits'>: <pyxb.binding.facets.CF_fractionDigits object>, <class 'pyxb.binding.facets.CF_pattern'>: <pyxb.binding.facets.CF_pattern object>}
class pyxb.binding.datatypes.integer(*args, **kw)

Bases: pyxb.binding.basis.simpleTypeDefinition, long, pyxb.binding.basis._NoNullaryNonNillableNew_mixin

XMLSchema datatype integer<http://www.w3.org/TR/xmlschema-2/#integer>.

classmethod XsdLiteral(value)
_CF_fractionDigits = <pyxb.binding.facets.CF_fractionDigits object>
_CF_pattern = <pyxb.binding.facets.CF_pattern object>
_ExpandedName = <pyxb.namespace.ExpandedName object>
_XsdBaseType

alias of decimal

_httpwww_w3_org2001XMLSchema_integer_FacetMap = {<class 'pyxb.binding.facets.CF_totalDigits'>: <pyxb.binding.facets.CF_totalDigits object>, <class 'pyxb.binding.facets.CF_maxExclusive'>: <pyxb.binding.facets.CF_maxExclusive object>, <class 'pyxb.binding.facets.CF_minExclusive'>: <pyxb.binding.facets.CF_minExclusive object>, <class 'pyxb.binding.facets.CF_minInclusive'>: <pyxb.binding.facets.CF_minInclusive object>, <class 'pyxb.binding.facets.CF_maxInclusive'>: <pyxb.binding.facets.CF_maxInclusive object>, <class 'pyxb.binding.facets.CF_whiteSpace'>: <pyxb.binding.facets.CF_whiteSpace object>, <class 'pyxb.binding.facets.CF_enumeration'>: <pyxb.binding.facets.CF_enumeration object>, <class 'pyxb.binding.facets.CF_fractionDigits'>: <pyxb.binding.facets.CF_fractionDigits object>, <class 'pyxb.binding.facets.CF_pattern'>: <pyxb.binding.facets.CF_pattern object>}
class pyxb.binding.datatypes.language(*args, **kw)

Bases: pyxb.binding.datatypes.token

XMLSchema datatype language<http:///www.w3.org/TR/xmlschema-2/#language>

_CF_pattern = <pyxb.binding.facets.CF_pattern object>
_ExpandedName = <pyxb.namespace.ExpandedName object>
_ValidRE = <_sre.SRE_Pattern object>
_httpwww_w3_org2001XMLSchema_language_FacetMap = {<class 'pyxb.binding.facets.CF_pattern'>: <pyxb.binding.facets.CF_pattern object>}
class pyxb.binding.datatypes.long(*args, **kw)

Bases: pyxb.binding.datatypes.integer

XMLSchema datatype long<http://www.w3.org/TR/xmlschema-2/#long>.

_CF_maxInclusive = <pyxb.binding.facets.CF_maxInclusive object>
_CF_minInclusive = <pyxb.binding.facets.CF_minInclusive object>
_ExpandedName = <pyxb.namespace.ExpandedName object>
_httpwww_w3_org2001XMLSchema_long_FacetMap = {<class 'pyxb.binding.facets.CF_totalDigits'>: <pyxb.binding.facets.CF_totalDigits object>, <class 'pyxb.binding.facets.CF_maxExclusive'>: <pyxb.binding.facets.CF_maxExclusive object>, <class 'pyxb.binding.facets.CF_minExclusive'>: <pyxb.binding.facets.CF_minExclusive object>, <class 'pyxb.binding.facets.CF_minInclusive'>: <pyxb.binding.facets.CF_minInclusive object>, <class 'pyxb.binding.facets.CF_maxInclusive'>: <pyxb.binding.facets.CF_maxInclusive object>, <class 'pyxb.binding.facets.CF_whiteSpace'>: <pyxb.binding.facets.CF_whiteSpace object>, <class 'pyxb.binding.facets.CF_enumeration'>: <pyxb.binding.facets.CF_enumeration object>, <class 'pyxb.binding.facets.CF_fractionDigits'>: <pyxb.binding.facets.CF_fractionDigits object>, <class 'pyxb.binding.facets.CF_pattern'>: <pyxb.binding.facets.CF_pattern object>}
class pyxb.binding.datatypes.negativeInteger(*args, **kw)

Bases: pyxb.binding.datatypes.nonPositiveInteger

XMLSchema datatype negativeInteger<http://www.w3.org/TR/xmlschema-2/#negativeInteger>.

_CF_maxInclusive = <pyxb.binding.facets.CF_maxInclusive object>
_ExpandedName = <pyxb.namespace.ExpandedName object>
_httpwww_w3_org2001XMLSchema_negativeInteger_FacetMap = {<class 'pyxb.binding.facets.CF_totalDigits'>: <pyxb.binding.facets.CF_totalDigits object>, <class 'pyxb.binding.facets.CF_maxExclusive'>: <pyxb.binding.facets.CF_maxExclusive object>, <class 'pyxb.binding.facets.CF_minExclusive'>: <pyxb.binding.facets.CF_minExclusive object>, <class 'pyxb.binding.facets.CF_minInclusive'>: <pyxb.binding.facets.CF_minInclusive object>, <class 'pyxb.binding.facets.CF_maxInclusive'>: <pyxb.binding.facets.CF_maxInclusive object>, <class 'pyxb.binding.facets.CF_whiteSpace'>: <pyxb.binding.facets.CF_whiteSpace object>, <class 'pyxb.binding.facets.CF_enumeration'>: <pyxb.binding.facets.CF_enumeration object>, <class 'pyxb.binding.facets.CF_fractionDigits'>: <pyxb.binding.facets.CF_fractionDigits object>, <class 'pyxb.binding.facets.CF_pattern'>: <pyxb.binding.facets.CF_pattern object>}
class pyxb.binding.datatypes.nonNegativeInteger(*args, **kw)

Bases: pyxb.binding.datatypes.integer

XMLSchema datatype nonNegativeInteger<http://www.w3.org/TR/xmlschema-2/#nonNegativeInteger>.

_CF_minInclusive = <pyxb.binding.facets.CF_minInclusive object>
_ExpandedName = <pyxb.namespace.ExpandedName object>
_httpwww_w3_org2001XMLSchema_nonNegativeInteger_FacetMap = {<class 'pyxb.binding.facets.CF_totalDigits'>: <pyxb.binding.facets.CF_totalDigits object>, <class 'pyxb.binding.facets.CF_maxExclusive'>: <pyxb.binding.facets.CF_maxExclusive object>, <class 'pyxb.binding.facets.CF_minExclusive'>: <pyxb.binding.facets.CF_minExclusive object>, <class 'pyxb.binding.facets.CF_minInclusive'>: <pyxb.binding.facets.CF_minInclusive object>, <class 'pyxb.binding.facets.CF_maxInclusive'>: <pyxb.binding.facets.CF_maxInclusive object>, <class 'pyxb.binding.facets.CF_whiteSpace'>: <pyxb.binding.facets.CF_whiteSpace object>, <class 'pyxb.binding.facets.CF_enumeration'>: <pyxb.binding.facets.CF_enumeration object>, <class 'pyxb.binding.facets.CF_fractionDigits'>: <pyxb.binding.facets.CF_fractionDigits object>, <class 'pyxb.binding.facets.CF_pattern'>: <pyxb.binding.facets.CF_pattern object>}
class pyxb.binding.datatypes.nonPositiveInteger(*args, **kw)

Bases: pyxb.binding.datatypes.integer

XMLSchema datatype nonPositiveInteger<http://www.w3.org/TR/xmlschema-2/#nonPositiveInteger>.

_CF_maxInclusive = <pyxb.binding.facets.CF_maxInclusive object>
_ExpandedName = <pyxb.namespace.ExpandedName object>
_httpwww_w3_org2001XMLSchema_nonPositiveInteger_FacetMap = {<class 'pyxb.binding.facets.CF_totalDigits'>: <pyxb.binding.facets.CF_totalDigits object>, <class 'pyxb.binding.facets.CF_maxExclusive'>: <pyxb.binding.facets.CF_maxExclusive object>, <class 'pyxb.binding.facets.CF_minExclusive'>: <pyxb.binding.facets.CF_minExclusive object>, <class 'pyxb.binding.facets.CF_minInclusive'>: <pyxb.binding.facets.CF_minInclusive object>, <class 'pyxb.binding.facets.CF_maxInclusive'>: <pyxb.binding.facets.CF_maxInclusive object>, <class 'pyxb.binding.facets.CF_whiteSpace'>: <pyxb.binding.facets.CF_whiteSpace object>, <class 'pyxb.binding.facets.CF_enumeration'>: <pyxb.binding.facets.CF_enumeration object>, <class 'pyxb.binding.facets.CF_fractionDigits'>: <pyxb.binding.facets.CF_fractionDigits object>, <class 'pyxb.binding.facets.CF_pattern'>: <pyxb.binding.facets.CF_pattern object>}
class pyxb.binding.datatypes.normalizedString(*args, **kw)

Bases: pyxb.binding.datatypes.string

XMLSchema datatype normalizedString<http:///www.w3.org/TR/xmlschema-2/#normalizedString>.

Normalized strings can’t have carriage returns, linefeeds, or tabs in them.

_CF_whiteSpace = <pyxb.binding.facets.CF_whiteSpace object>
_ExpandedName = <pyxb.namespace.ExpandedName object>
_InvalidRE = None
_ValidRE = None
classmethod _ValidateString_va(value)

Post-extended method to validate that a string matches a given pattern.

If you can express the valid strings as a compiled regular expression in the class variable _ValidRE, or the invalid strings as a compiled regular expression in the class variable _InvalidRE, you can just use those. If the acceptable matches are any trickier, you should invoke the superclass implementation, and if it returns True then perform additional tests.

classmethod _XsdConstraintsPreCheck_vb(value)
_httpwww_w3_org2001XMLSchema_normalizedString_FacetMap = {<class 'pyxb.binding.facets.CF_whiteSpace'>: <pyxb.binding.facets.CF_whiteSpace object>}
_normalizedString__BadChars = <_sre.SRE_Pattern object>
classmethod _normalizedString__ValidateString(value)
class pyxb.binding.datatypes.positiveInteger(*args, **kw)

Bases: pyxb.binding.datatypes.nonNegativeInteger

XMLSchema datatype positiveInteger<http://www.w3.org/TR/xmlschema-2/#positiveInteger>.

_CF_minInclusive = <pyxb.binding.facets.CF_minInclusive object>
_ExpandedName = <pyxb.namespace.ExpandedName object>
_httpwww_w3_org2001XMLSchema_positiveInteger_FacetMap = {<class 'pyxb.binding.facets.CF_totalDigits'>: <pyxb.binding.facets.CF_totalDigits object>, <class 'pyxb.binding.facets.CF_maxExclusive'>: <pyxb.binding.facets.CF_maxExclusive object>, <class 'pyxb.binding.facets.CF_minExclusive'>: <pyxb.binding.facets.CF_minExclusive object>, <class 'pyxb.binding.facets.CF_minInclusive'>: <pyxb.binding.facets.CF_minInclusive object>, <class 'pyxb.binding.facets.CF_maxInclusive'>: <pyxb.binding.facets.CF_maxInclusive object>, <class 'pyxb.binding.facets.CF_whiteSpace'>: <pyxb.binding.facets.CF_whiteSpace object>, <class 'pyxb.binding.facets.CF_enumeration'>: <pyxb.binding.facets.CF_enumeration object>, <class 'pyxb.binding.facets.CF_fractionDigits'>: <pyxb.binding.facets.CF_fractionDigits object>, <class 'pyxb.binding.facets.CF_pattern'>: <pyxb.binding.facets.CF_pattern object>}
class pyxb.binding.datatypes.short(*args, **kw)

Bases: pyxb.binding.datatypes.int

XMLSchema datatype short<http://www.w3.org/TR/xmlschema-2/#short>.

_CF_maxInclusive = <pyxb.binding.facets.CF_maxInclusive object>
_CF_minInclusive = <pyxb.binding.facets.CF_minInclusive object>
_ExpandedName = <pyxb.namespace.ExpandedName object>
_httpwww_w3_org2001XMLSchema_short_FacetMap = {<class 'pyxb.binding.facets.CF_totalDigits'>: <pyxb.binding.facets.CF_totalDigits object>, <class 'pyxb.binding.facets.CF_maxExclusive'>: <pyxb.binding.facets.CF_maxExclusive object>, <class 'pyxb.binding.facets.CF_minExclusive'>: <pyxb.binding.facets.CF_minExclusive object>, <class 'pyxb.binding.facets.CF_minInclusive'>: <pyxb.binding.facets.CF_minInclusive object>, <class 'pyxb.binding.facets.CF_maxInclusive'>: <pyxb.binding.facets.CF_maxInclusive object>, <class 'pyxb.binding.facets.CF_whiteSpace'>: <pyxb.binding.facets.CF_whiteSpace object>, <class 'pyxb.binding.facets.CF_enumeration'>: <pyxb.binding.facets.CF_enumeration object>, <class 'pyxb.binding.facets.CF_fractionDigits'>: <pyxb.binding.facets.CF_fractionDigits object>, <class 'pyxb.binding.facets.CF_pattern'>: <pyxb.binding.facets.CF_pattern object>}
class pyxb.binding.datatypes.string(*args, **kw)

Bases: pyxb.binding.basis.simpleTypeDefinition, unicode

XMLSchema datatype string<http://www.w3.org/TR/xmlschema-2/#string>.

classmethod XsdLiteral(value)
classmethod XsdValueLength(value)
_CF_enumeration = <pyxb.binding.facets.CF_enumeration object>
_CF_length = <pyxb.binding.facets.CF_length object>
_CF_maxLength = <pyxb.binding.facets.CF_maxLength object>
_CF_minLength = <pyxb.binding.facets.CF_minLength object>
_CF_pattern = <pyxb.binding.facets.CF_pattern object>
_CF_whiteSpace = <pyxb.binding.facets.CF_whiteSpace object>
_ExpandedName = <pyxb.namespace.ExpandedName object>
_XsdBaseType

alias of anySimpleType

_httpwww_w3_org2001XMLSchema_string_FacetMap = {<class 'pyxb.binding.facets.CF_length'>: <pyxb.binding.facets.CF_length object>, <class 'pyxb.binding.facets.CF_whiteSpace'>: <pyxb.binding.facets.CF_whiteSpace object>, <class 'pyxb.binding.facets.CF_enumeration'>: <pyxb.binding.facets.CF_enumeration object>, <class 'pyxb.binding.facets.CF_minLength'>: <pyxb.binding.facets.CF_minLength object>, <class 'pyxb.binding.facets.CF_maxLength'>: <pyxb.binding.facets.CF_maxLength object>, <class 'pyxb.binding.facets.CF_pattern'>: <pyxb.binding.facets.CF_pattern object>}
class pyxb.binding.datatypes.time(*args, **kw)

Bases: pyxb.binding.datatypes._PyXBDateTime_base, datetime.time

XMLSchema datatype time<http://www.w3.org/TR/xmlschema-2/#time>.

This class uses the Python datetime.time class as its underlying representation. Note that per the XMLSchema spec, all dateTime objects are in UTC, and that timezone information in the string representation in XML is an indication of the local time zone’s offset from UTC. Presence of time zone information in the lexical space is indicated by the tzinfo field.

Note:pyxb.PreserveInputTimeZone() can be used to bypass the

normalization to UTC.

_CF_enumeration = <pyxb.binding.facets.CF_enumeration object>
_CF_maxExclusive = <pyxb.binding.facets.CF_maxExclusive object>
_CF_maxInclusive = <pyxb.binding.facets.CF_maxInclusive object>
_CF_minExclusive = <pyxb.binding.facets.CF_minExclusive object>
_CF_minInclusive = <pyxb.binding.facets.CF_minInclusive object>
_CF_pattern = <pyxb.binding.facets.CF_pattern object>
_CF_whiteSpace = <pyxb.binding.facets.CF_whiteSpace object>
_ExpandedName = <pyxb.namespace.ExpandedName object>
_Lexical_fmt = '%H:%M:%S'
_XsdBaseType

alias of anySimpleType

_httpwww_w3_org2001XMLSchema_time_FacetMap = {<class 'pyxb.binding.facets.CF_maxExclusive'>: <pyxb.binding.facets.CF_maxExclusive object>, <class 'pyxb.binding.facets.CF_minExclusive'>: <pyxb.binding.facets.CF_minExclusive object>, <class 'pyxb.binding.facets.CF_minInclusive'>: <pyxb.binding.facets.CF_minInclusive object>, <class 'pyxb.binding.facets.CF_maxInclusive'>: <pyxb.binding.facets.CF_maxInclusive object>, <class 'pyxb.binding.facets.CF_whiteSpace'>: <pyxb.binding.facets.CF_whiteSpace object>, <class 'pyxb.binding.facets.CF_enumeration'>: <pyxb.binding.facets.CF_enumeration object>, <class 'pyxb.binding.facets.CF_pattern'>: <pyxb.binding.facets.CF_pattern object>}
_time__CtorFields = ('hour', 'minute', 'second', 'microsecond', 'tzinfo')
class pyxb.binding.datatypes.token(*args, **kw)

Bases: pyxb.binding.datatypes.normalizedString

XMLSchema datatype token<http:///www.w3.org/TR/xmlschema-2/#token>.

Tokens cannot leading or trailing space characters; any carriage return, line feed, or tab characters; nor any occurrence of two or more consecutive space characters.

_CF_whiteSpace = <pyxb.binding.facets.CF_whiteSpace object>
_ExpandedName = <pyxb.namespace.ExpandedName object>
classmethod _ValidateString_va(value)
_httpwww_w3_org2001XMLSchema_token_FacetMap = {<class 'pyxb.binding.facets.CF_whiteSpace'>: <pyxb.binding.facets.CF_whiteSpace object>}
class pyxb.binding.datatypes.unsignedByte(*args, **kw)

Bases: pyxb.binding.datatypes.unsignedShort

XMLSchema datatype unsignedByte<http://www.w3.org/TR/xmlschema-2/#unsignedByte>.

_CF_maxInclusive = <pyxb.binding.facets.CF_maxInclusive object>
_ExpandedName = <pyxb.namespace.ExpandedName object>
_httpwww_w3_org2001XMLSchema_unsignedByte_FacetMap = {<class 'pyxb.binding.facets.CF_totalDigits'>: <pyxb.binding.facets.CF_totalDigits object>, <class 'pyxb.binding.facets.CF_maxExclusive'>: <pyxb.binding.facets.CF_maxExclusive object>, <class 'pyxb.binding.facets.CF_minExclusive'>: <pyxb.binding.facets.CF_minExclusive object>, <class 'pyxb.binding.facets.CF_minInclusive'>: <pyxb.binding.facets.CF_minInclusive object>, <class 'pyxb.binding.facets.CF_maxInclusive'>: <pyxb.binding.facets.CF_maxInclusive object>, <class 'pyxb.binding.facets.CF_whiteSpace'>: <pyxb.binding.facets.CF_whiteSpace object>, <class 'pyxb.binding.facets.CF_enumeration'>: <pyxb.binding.facets.CF_enumeration object>, <class 'pyxb.binding.facets.CF_fractionDigits'>: <pyxb.binding.facets.CF_fractionDigits object>, <class 'pyxb.binding.facets.CF_pattern'>: <pyxb.binding.facets.CF_pattern object>}
class pyxb.binding.datatypes.unsignedInt(*args, **kw)

Bases: pyxb.binding.datatypes.unsignedLong

XMLSchema datatype unsignedInt<http://www.w3.org/TR/xmlschema-2/#unsignedInt>.

_CF_maxInclusive = <pyxb.binding.facets.CF_maxInclusive object>
_ExpandedName = <pyxb.namespace.ExpandedName object>
_httpwww_w3_org2001XMLSchema_unsignedInt_FacetMap = {<class 'pyxb.binding.facets.CF_totalDigits'>: <pyxb.binding.facets.CF_totalDigits object>, <class 'pyxb.binding.facets.CF_maxExclusive'>: <pyxb.binding.facets.CF_maxExclusive object>, <class 'pyxb.binding.facets.CF_minExclusive'>: <pyxb.binding.facets.CF_minExclusive object>, <class 'pyxb.binding.facets.CF_minInclusive'>: <pyxb.binding.facets.CF_minInclusive object>, <class 'pyxb.binding.facets.CF_maxInclusive'>: <pyxb.binding.facets.CF_maxInclusive object>, <class 'pyxb.binding.facets.CF_whiteSpace'>: <pyxb.binding.facets.CF_whiteSpace object>, <class 'pyxb.binding.facets.CF_enumeration'>: <pyxb.binding.facets.CF_enumeration object>, <class 'pyxb.binding.facets.CF_fractionDigits'>: <pyxb.binding.facets.CF_fractionDigits object>, <class 'pyxb.binding.facets.CF_pattern'>: <pyxb.binding.facets.CF_pattern object>}
class pyxb.binding.datatypes.unsignedLong(*args, **kw)

Bases: pyxb.binding.datatypes.nonNegativeInteger

XMLSchema datatype unsignedLong<http://www.w3.org/TR/xmlschema-2/#unsignedLong>.

_CF_maxInclusive = <pyxb.binding.facets.CF_maxInclusive object>
_ExpandedName = <pyxb.namespace.ExpandedName object>
_httpwww_w3_org2001XMLSchema_unsignedLong_FacetMap = {<class 'pyxb.binding.facets.CF_totalDigits'>: <pyxb.binding.facets.CF_totalDigits object>, <class 'pyxb.binding.facets.CF_maxExclusive'>: <pyxb.binding.facets.CF_maxExclusive object>, <class 'pyxb.binding.facets.CF_minExclusive'>: <pyxb.binding.facets.CF_minExclusive object>, <class 'pyxb.binding.facets.CF_minInclusive'>: <pyxb.binding.facets.CF_minInclusive object>, <class 'pyxb.binding.facets.CF_maxInclusive'>: <pyxb.binding.facets.CF_maxInclusive object>, <class 'pyxb.binding.facets.CF_whiteSpace'>: <pyxb.binding.facets.CF_whiteSpace object>, <class 'pyxb.binding.facets.CF_enumeration'>: <pyxb.binding.facets.CF_enumeration object>, <class 'pyxb.binding.facets.CF_fractionDigits'>: <pyxb.binding.facets.CF_fractionDigits object>, <class 'pyxb.binding.facets.CF_pattern'>: <pyxb.binding.facets.CF_pattern object>}
class pyxb.binding.datatypes.unsignedShort(*args, **kw)

Bases: pyxb.binding.datatypes.unsignedInt

XMLSchema datatype unsignedShort<http://www.w3.org/TR/xmlschema-2/#unsignedShort>.

_CF_maxInclusive = <pyxb.binding.facets.CF_maxInclusive object>
_ExpandedName = <pyxb.namespace.ExpandedName object>
_httpwww_w3_org2001XMLSchema_unsignedShort_FacetMap = {<class 'pyxb.binding.facets.CF_totalDigits'>: <pyxb.binding.facets.CF_totalDigits object>, <class 'pyxb.binding.facets.CF_maxExclusive'>: <pyxb.binding.facets.CF_maxExclusive object>, <class 'pyxb.binding.facets.CF_minExclusive'>: <pyxb.binding.facets.CF_minExclusive object>, <class 'pyxb.binding.facets.CF_minInclusive'>: <pyxb.binding.facets.CF_minInclusive object>, <class 'pyxb.binding.facets.CF_maxInclusive'>: <pyxb.binding.facets.CF_maxInclusive object>, <class 'pyxb.binding.facets.CF_whiteSpace'>: <pyxb.binding.facets.CF_whiteSpace object>, <class 'pyxb.binding.facets.CF_enumeration'>: <pyxb.binding.facets.CF_enumeration object>, <class 'pyxb.binding.facets.CF_fractionDigits'>: <pyxb.binding.facets.CF_fractionDigits object>, <class 'pyxb.binding.facets.CF_pattern'>: <pyxb.binding.facets.CF_pattern object>}

pyxb.binding.facets module

Classes related to XMLSchema facets.

The definitions herein are from sections 4.2<http://www.w3.org/TR/xmlschema-2/index.html#rf-facets> and 4.3<http://www.w3.org/TR/xmlschema-2/index.html#rf-facets> of XML Schema Part 2: Datatypes<http://www.w3.org/TR/xmlschema-2/>. Facets are attributes of a datatype that constrain its lexical and value spaces.

class pyxb.binding.facets.CF_enumeration(**kw)

Bases: pyxb.binding.facets.ConstrainingFacet, pyxb.binding.facets._CollectionFacet_mixin, pyxb.binding.facets._LateDatatype_mixin

Capture a constraint that restricts valid values to a fixed set.

A STD that has an enumeration restriction should mix-in pyxb.binding.basis.enumeration_mixin, and should have a class variable titled _CF_enumeration that is an instance of this class.

“unicode” refers to the Unicode string by which the value is represented in XML.

“tag” refers to the Python member reference associated with the enumeration. The value is derived from the unicode value of the enumeration element and an optional prefix that identifies the owning simple type when the tag is promoted to module-level visibility.

“value” refers to the Python value held in the tag

See http://www.w3.org/TR/xmlschema-2/#rf-enumeration

_CF_enumeration__enumPrefix = None
_CF_enumeration__tagToElement = None
_CF_enumeration__unicodeToElement = None
_CF_enumeration__valueToElement = None
_CollectionFacet_itemType

alias of _EnumerationElement

_LateDatatypeBindsSuperclass = False
_Name = 'enumeration'
_validateConstraint_vx(value)
addEnumeration(**kw)
elementForValue(value)

Return the _EnumerationElement instance that has the given value.

Raises:KeyError – the value is not valid for the enumeration.
elements()
Deprecated:Use items or iteritems instead.
enumPrefix()
itervalues()

Generate the enumeration values.

valueForUnicode(ustr)

Return the enumeration value corresponding to the given unicode string.

If ustr is not a valid option for this enumeration, return None.

values()

Return a list of enumeration values.

class pyxb.binding.facets.CF_fractionDigits(**kw)

Bases: pyxb.binding.facets.ConstrainingFacet, pyxb.binding.facets._Fixed_mixin

Specify the number of sub-unit digits in the value space of the type.

See http://www.w3.org/TR/xmlschema-2/#rf-fractionDigits

_Name = 'fractionDigits'
_ValueDatatype

alias of nonNegativeInteger

_validateConstraint_vx(value)
class pyxb.binding.facets.CF_length(**kw)

Bases: pyxb.binding.facets.ConstrainingFacet, pyxb.binding.facets._Fixed_mixin

A facet that specifies the length of the lexical representation of a value.

See http://www.w3.org/TR/xmlschema-2/#rf-length

_Name = 'length'
_ValueDatatype

alias of nonNegativeInteger

_validateConstraint_vx(value)
class pyxb.binding.facets.CF_maxExclusive(**kw)

Bases: pyxb.binding.facets.ConstrainingFacet, pyxb.binding.facets._Fixed_mixin, pyxb.binding.facets._LateDatatype_mixin

Specify the exclusive upper bound of legal values for the constrained type.

See http://www.w3.org/TR/xmlschema-2/#rf-maxExclusive

_LateDatatypeBindsSuperclass = True
_Name = 'maxExclusive'
_validateConstraint_vx(value)
class pyxb.binding.facets.CF_maxInclusive(**kw)

Bases: pyxb.binding.facets.ConstrainingFacet, pyxb.binding.facets._Fixed_mixin, pyxb.binding.facets._LateDatatype_mixin

Specify the maximum legal value for the constrained type.

See http://www.w3.org/TR/xmlschema-2/#rf-maxInclusive

_LateDatatypeBindsSuperclass = False
_Name = 'maxInclusive'
_validateConstraint_vx(value)
class pyxb.binding.facets.CF_maxLength(**kw)

Bases: pyxb.binding.facets.ConstrainingFacet, pyxb.binding.facets._Fixed_mixin

A facet that constrains the length of the lexical representation of a value.

See http://www.w3.org/TR/xmlschema-2/#rf-minLength

_Name = 'maxLength'
_ValueDatatype

alias of nonNegativeInteger

_validateConstraint_vx(value)
class pyxb.binding.facets.CF_minExclusive(**kw)

Bases: pyxb.binding.facets.ConstrainingFacet, pyxb.binding.facets._Fixed_mixin, pyxb.binding.facets._LateDatatype_mixin

Specify the exclusive lower bound of legal values for the constrained type.

See http://www.w3.org/TR/xmlschema-2/#rf-minExclusive

_LateDatatypeBindsSuperclass = True
_Name = 'minExclusive'
_validateConstraint_vx(value)
class pyxb.binding.facets.CF_minInclusive(**kw)

Bases: pyxb.binding.facets.ConstrainingFacet, pyxb.binding.facets._Fixed_mixin, pyxb.binding.facets._LateDatatype_mixin

Specify the minimum legal value for the constrained type.

See http://www.w3.org/TR/xmlschema-2/#rf-minInclusive

_LateDatatypeBindsSuperclass = False
_Name = 'minInclusive'
_validateConstraint_vx(value)
class pyxb.binding.facets.CF_minLength(**kw)

Bases: pyxb.binding.facets.ConstrainingFacet, pyxb.binding.facets._Fixed_mixin

A facet that constrains the length of the lexical representation of a value.

See http://www.w3.org/TR/xmlschema-2/#rf-minLength

_Name = 'minLength'
_ValueDatatype

alias of nonNegativeInteger

_validateConstraint_vx(value)
class pyxb.binding.facets.CF_pattern(**kw)

Bases: pyxb.binding.facets.ConstrainingFacet, pyxb.binding.facets._CollectionFacet_mixin

A facet that constrains the lexical representation of a value to match one of a set of patterns.

See http://www.w3.org/TR/xmlschema-2/#rf-pattern

Note:In PyXB, pattern constraints are ignored for any type with

a Python representation that does not derive from a string type. This is due to the difficulty in reconstructing the lexical representation of a non-string type after it has been converted to its value space.

Todo:On creating new instances of non-string simple types from

string representations, we could apply pattern constraints. That would mean checking them prior to invoking the Factory method.

_CF_pattern__patternElements = None
_CollectionFacet_itemType

alias of _PatternElement

_Name = 'pattern'
_ValueDatatype

alias of string

_validateConstraint_vx(value)
addPattern(**kw)
patternElements()
class pyxb.binding.facets.CF_totalDigits(**kw)

Bases: pyxb.binding.facets.ConstrainingFacet, pyxb.binding.facets._Fixed_mixin

Specify the number of digits in the value space of the type.

See http://www.w3.org/TR/xmlschema-2/#rf-totalDigits

_Name = 'totalDigits'
_ValueDatatype

alias of positiveInteger

_validateConstraint_vx(value)
class pyxb.binding.facets.CF_whiteSpace(**kw)

Bases: pyxb.binding.facets.ConstrainingFacet, pyxb.binding.facets._Fixed_mixin

Specify the value-space interpretation of whitespace.

See http://www.w3.org/TR/xmlschema-2/#rf-whiteSpace

_CF_whiteSpace__MultiSpace_re = <_sre.SRE_Pattern object>
_CF_whiteSpace__TabCRLF_re = <_sre.SRE_Pattern object>
_Name = 'whiteSpace'
_ValueDatatype

alias of _WhiteSpace_enum

_validateConstraint_vx(value)

No validation rules for whitespace facet.

normalizeString(value)

Normalize the given string in accordance with the configured whitespace interpretation.

class pyxb.binding.facets.ConstrainingFacet(**kw)

Bases: pyxb.binding.facets.Facet

One of the facets defined in section 4.3, which provide constraints on the lexical space of a type definition.

Facets = [<class 'pyxb.binding.facets.CF_length'>, <class 'pyxb.binding.facets.CF_minLength'>, <class 'pyxb.binding.facets.CF_maxLength'>, <class 'pyxb.binding.facets.CF_pattern'>, <class 'pyxb.binding.facets.CF_enumeration'>, <class 'pyxb.binding.facets.CF_whiteSpace'>, <class 'pyxb.binding.facets.CF_minInclusive'>, <class 'pyxb.binding.facets.CF_maxInclusive'>, <class 'pyxb.binding.facets.CF_minExclusive'>, <class 'pyxb.binding.facets.CF_maxExclusive'>, <class 'pyxb.binding.facets.CF_totalDigits'>, <class 'pyxb.binding.facets.CF_fractionDigits'>]
_ConstrainingFacet__setFromKeywords(**kw)
_FacetPrefix = 'CF'
_setFromKeywords_vb(**kw)

Extend base class.

Additional keywords: * value

_validateConstraint_vx(value)
validateConstraint(value)

Return True iff the given value satisfies the constraint represented by this facet instance.

The actual test is delegated to the subclasses.

class pyxb.binding.facets.FF_bounded(**kw)

Bases: pyxb.binding.facets.FundamentalFacet

Specifies that the associated type supports a notion of bounds.

See http://www.w3.org/TR/xmlschema-2/#rf-bounded

_Name = 'bounded'
_ValueDatatype

alias of boolean

class pyxb.binding.facets.FF_cardinality(**kw)

Bases: pyxb.binding.facets.FundamentalFacet

Specifies that the associated type supports a notion of length.

See http://www.w3.org/TR/xmlschema-2/#rf-cardinality

_LegalValues = ('finite', 'countably infinite')
_Name = 'cardinality'
_ValueDatatype

alias of string

class pyxb.binding.facets.FF_equal(**kw)

Bases: pyxb.binding.facets.FundamentalFacet

Specifies that the associated type supports a notion of equality.

See http://www.w3.org/TR/xmlschema-2/#equal

_Name = 'equal'
class pyxb.binding.facets.FF_numeric(**kw)

Bases: pyxb.binding.facets.FundamentalFacet

Specifies that the associated type represents a number.

See http://www.w3.org/TR/xmlschema-2/#rf-numeric

_Name = 'numeric'
_ValueDatatype

alias of boolean

class pyxb.binding.facets.FF_ordered(**kw)

Bases: pyxb.binding.facets.FundamentalFacet

Specifies that the associated type supports a notion of order.

See http://www.w3.org/TR/xmlschema-2/#rf-ordered

_LegalValues = ('false', 'partial', 'total')
_Name = 'ordered'
_ValueDatatype

alias of string

class pyxb.binding.facets.Facet(**kw)

Bases: pyxb.cscRoot

The base class for facets.

This provides association with STDs, a name, and a value for the facet.

classmethod ClassForFacet(name)

Given the name of a facet, return the Facet subclass that represents it.

Facets = [<class 'pyxb.binding.facets.CF_length'>, <class 'pyxb.binding.facets.CF_minLength'>, <class 'pyxb.binding.facets.CF_maxLength'>, <class 'pyxb.binding.facets.CF_pattern'>, <class 'pyxb.binding.facets.CF_enumeration'>, <class 'pyxb.binding.facets.CF_whiteSpace'>, <class 'pyxb.binding.facets.CF_minInclusive'>, <class 'pyxb.binding.facets.CF_maxInclusive'>, <class 'pyxb.binding.facets.CF_minExclusive'>, <class 'pyxb.binding.facets.CF_maxExclusive'>, <class 'pyxb.binding.facets.CF_totalDigits'>, <class 'pyxb.binding.facets.CF_fractionDigits'>, <class 'pyxb.binding.facets.FF_equal'>, <class 'pyxb.binding.facets.FF_ordered'>, <class 'pyxb.binding.facets.FF_bounded'>, <class 'pyxb.binding.facets.FF_cardinality'>, <class 'pyxb.binding.facets.FF_numeric'>]
classmethod Name()

The name of a facet is a class constant.

_Facet__annotation = None
_Facet__baseTypeDefinition = None
_Facet__ownerTypeDefinition = None
_Facet__value = None
_Facet__valueDatatype = None
_Name = None
_ValueDatatype = None
_setFromKeywords_vb(**kw)

Configure values of the facet from a set of keywords.

This method is pre-extended; subclasses should invoke the parent method after setting their local configuration.

Parameters:
  • _reset – If False or missing, existing values will be retained if they do not appear in the keywords. If True, members not defined in the keywords are set to a default.
  • base_type_definition
  • owner_type_definition
  • value_datatype
_value(v)
_valueString()
annotation()
baseTypeDefinition()

The SimpleTypeDefinition component restricted by this facet.

Note: this is NOT the STD to which the facet belongs, but is usually that STD’s base type. I.e., this jumps us through all the containing restrictions and extensions to get to the core type definition.

ownerTypeDefinition()

The SimpleTypeDefinition component to which this facet belongs.

I.e., the one in which the hasFacet specification was found. This value is None if the facet is not associated with an STD.

setFromKeywords(**kw)

Public entrypoint to the _setFromKeywords_vb call hierarchy.

value()
valueDatatype()

Get the datatype used to represent values of the facet.

This usually has nothing to do with the owner datatype; for example, the length facet may apply to any STD but the value of the facet is an integer. In generated bindings this is usually set explicitly in the facet constructor; when processing a schema, it is derived from the value’s type definition.

class pyxb.binding.facets.FundamentalFacet(**kw)

Bases: pyxb.binding.facets.Facet

A fundamental facet provides information on the value space of the associated type.

classmethod CreateFromDOM(node, owner_type_definition, base_type_definition=None)
Facets = [<class 'pyxb.binding.facets.FF_equal'>, <class 'pyxb.binding.facets.FF_ordered'>, <class 'pyxb.binding.facets.FF_bounded'>, <class 'pyxb.binding.facets.FF_cardinality'>, <class 'pyxb.binding.facets.FF_numeric'>]
_FacetPrefix = 'FF'
_updateFromDOM(node)
updateFromDOM(node)
class pyxb.binding.facets._CollectionFacet_mixin(*args, **kw)

Bases: pyxb.cscRoot

Mix-in to handle facets whose values are collections, not scalars.

For example, the enumeration and pattern facets maintain a list of enumeration values and patterns, respectively, as their value space.

Subclasses must define a class variable _CollectionFacet_itemType which is a reference to a class that is used to construct members of the collection.

_CollectionFacet_mixin__items = None
_items()

The members of the collection, as a reference.

_setFromKeywords_vb(**kw)

Extend base class.

Parameters:_constructor – If False or absent, the object being set is a member of the collection. If True, the object being set is the collection itself.
items()

The members of the collection, as a copy.

iteritems()

The members of the collection as an iterator

class pyxb.binding.facets._EnumerationElement(enumeration=None, unicode_value=None, description=None, annotation=None, tag=None, **kw)

Bases: object

This class represents individual values that appear within a CF_enumeration collection.

_EnumerationElement__enumeration = None
_EnumerationElement__tag = None
_EnumerationElement__unicodeValue = None
_EnumerationElement__value = None
_setTag(tag)

Set the tag to be used for this enumeration.

enumeration()

A reference to the CF_enumeration instance that owns this element.

tag()

The Python identifier used for the named constant representing the enumeration value.

This should include any desired prefix, since it must be unique within its binding class. If None, no enumeration constant will be generated.

unicodeValue()

The unicode string that defines the enumeration value.

value()

The Python value that is used for equality testing against this enumeration.

This is an instance of enumeration.valueDatatype(), initialized from the unicodeValue.

class pyxb.binding.facets._Enumeration_mixin(*args, **kw)

Bases: pyxb.cscRoot

Marker class to indicate that the generated binding has enumeration members.

classmethod valueForUnicode(ustr)
class pyxb.binding.facets._Fixed_mixin(*args, **kw)

Bases: pyxb.cscRoot

Mix-in to a constraining facet that adds support for the ‘fixed’ property.

_Fixed_mixin__fixed = None
_Fixed_mixin__setFromKeywords(**kw)
_setFromKeywords_vb(**kw)

Extend base class.

Additional keywords: * fixed

fixed()
class pyxb.binding.facets._LateDatatype_mixin(*args, **kw)

Bases: pyxb.cscRoot

Marker class to indicate that the facet instance must be told its datatype when it is constructed.

This is necessary for facets like CF_minInclusive and CF_minExclusive, for which the value is determined by the base type definition of the associated STD. In some cases the value that must be used in the facet cannot be represented in the Python type used for the facet; see LateDatatypeBindsSuperclass.

classmethod BindingValueDatatype(value_type)

Find the datatype for facet values when this facet is bound to the given value_type.

If the value_type is an STD, the associated Python support datatype from this value_type scanning up through the base type hierarchy is used.

classmethod LateDatatypeBindsSuperclass()

Return true if false if the proposed datatype should be used, or True if the base type definition of the proposed datatype should be used.

_LateDatatypeBindsSuperclass = None

The class variable that indicates that the Subclasses must override this variable with a value of True or False. The value is True iff the value used for the facet is not within the value space of the corresponding value datatype; for example, CF_minExclusive.

bindValueDatatype(value_datatype)
class pyxb.binding.facets._PatternElement(pattern=None, value=None, annotation=None, **kw)

Bases: pyxb.utils.utility.PrivateTransient_mixin

This class represents individual patterns that appear within a CF_pattern collection.

_PatternElement__PrivateTransient = set(['compiledExpression'])
_PatternElement__compiledExpression = None
_PatternElement__pythonExpression = None
annotation = None
matches(text)
pattern = None
class pyxb.binding.facets._WhiteSpace_enum(*args, **kw)

Bases: pyxb.binding.datatypes.NMTOKEN, pyxb.binding.facets._Enumeration_mixin

The enumeration used to constrain the whiteSpace facet

_CF_enumeration = <pyxb.binding.facets.CF_enumeration object>
_httpwww_w3_org2001XMLSchema__WhiteSpace_enum_FacetMap = {<class 'pyxb.binding.facets.CF_enumeration'>: <pyxb.binding.facets.CF_enumeration object>}
collapse = u'collapse'
preserve = u'preserve'
replace = u'replace'

pyxb.binding.generate module

The really ugly code that generates the Python bindings. This whole thing is going to be refactored once customized generation makes it to the top of the task queue.

class pyxb.binding.generate.BindingIO(binding_module, **kw)

Bases: object

_BindingIO__bindingFile = None
_BindingIO__bindingFilePath = None
_BindingIO__bindingModule = None
_BindingIO__postscript = None
_BindingIO__prolog = None
_BindingIO__stringIO = None
_BindingIO__templateMap = None
appendPrologBoilerplate(tm)
bindingFile()
bindingModule()
contents()
expand(template, **kw)
literal(*args, **kw)
postscript()
prolog()
write(template, **kw)
pyxb.binding.generate.BuildPluralityData(term_tree)

Walk a term tree to determine which element declarations may appear multiple times.

The bindings need to use a list for any Python attribute corresponding to an element declaration that can occur multiple times in the content model. The number of occurrences is determined by the occurrence constraints on parent particles and the compositors of containing model groups. All this information is available in the term tree used for the content model automaton.

Parameters:term_tree – A FAC term tree

representing the content model for a complex data type.

Returns:Plurality data, as a pair (singles, multiples) where

singles is a set of base L{element declarations<xs.structures.ElementDeclaration>} that are known to occur at least once and at most once in a region of the content, and multiples is a similar set of declarations that are known to potentially occur more than once.

pyxb.binding.generate.BuildTermTree(node)

Construct a FAC term tree for a particle.

This translates the XML schema content model of particles, model groups, element declarations, and wildcards into a tree expressing the corresponding content as a regular expression with numerical constraints.

Parameters:node – An instance of xs.structures.Particle
Returns:An instance of pyxb.utils.fac.Node
pyxb.binding.generate.GenerateAutomaton(ctd, **kw)
pyxb.binding.generate.GenerateCTD(ctd, generator, **kw)
pyxb.binding.generate.GenerateED(ed, generator, **kw)
pyxb.binding.generate.GenerateFacets(td, generator, **kw)
pyxb.binding.generate.GeneratePython(schema_location=None, schema_text=None, namespace=None, module_prefix_elts=[], **kw)
pyxb.binding.generate.GenerateSTD(std, generator)
class pyxb.binding.generate.Generator(*args, **kw)

Bases: object

Configuration and data for a single binding-generation action.

_DEFAULT_bindingRoot = '.'
_Generator__OptionSetters = (('binding_root', <function setBindingRoot>), ('schema_root', <function setSchemaRoot>), ('schema_stripped_prefix', <function setSchemaStrippedPrefix>), ('location_prefix_rewrite', <function argAddLocationPrefixRewrite>), ('schema_location', <function setSchemaLocationList>), ('module', <function _setModuleList>), ('module_prefix', <function setModulePrefix>), ('archive_path', <function setArchivePath>), ('no_load_namespace', <function _setNoLoadNamespaces>), ('import_augmentable_namespace', <function _setImportAugmentableNamespaces>), ('archive_to_file', <function setArchiveToFile>), ('default_namespace_public', <function setDefaultNamespacePublic>), ('validate_changes', <function setValidateChanges>), ('write_for_customization', <function setWriteForCustomization>), ('allow_builtin_generation', <function setAllowBuiltinGeneration>), ('allow_absent_module', <function setAllowAbsentModule>), ('uri_content_archive_directory', <function setUriContentArchiveDirectory>), ('logging_config_file', <function setLoggingConfigFile>))
_Generator__allowAbsentModule = None
_Generator__allowBuiltinGeneration = None
_Generator__archivePath = None
_Generator__archiveToFile = None
_Generator__bindingModules = None
_Generator__bindingRoot = None
_Generator__componentGraph = None
_Generator__componentOrder = None
_Generator__defaultNamespacePublic = None
_Generator__didResolveExternalSchema = False
_Generator__generateBindings()
_Generator__generateToFiles = None
_Generator__generationUID = None
_Generator__graphFromComponents(components, include_lax)
_Generator__importAugmentableNamespaces = None
_Generator__locationPrefixMap = {}
_Generator__loggingConfigFile = None
_Generator__moduleFilePath(module_elts, inhibit_extension=False)
_Generator__moduleList = None
_Generator__modulePrefix = None
_Generator__moduleRecords = None
_Generator__namespaceModuleMap = None
_Generator__namespaceVisibilityMap = None
_Generator__namespaces = None
_Generator__noloadNamespaces = None
_Generator__optionParser = None
_Generator__resolveComponentDependencies()
_Generator__schemaLocationList = None
_Generator__schemaRoot = None
_Generator__schemaStrippedPrefix = None
_Generator__schemas = None
_Generator__stripSpaces(string)
_Generator__stripSpaces_re = <_sre.SRE_Pattern object>
_Generator__uriContentArchiveDirectory = None
_Generator__validateChanges = None
_Generator__writeForCustomization = None
_setImportAugmentableNamespaces(namespace_set)

Return the set of namespaces that may be augmented by import directives.

_setModuleList(module_list)
_setNamespaceVisibilities(public, private)
_setNoLoadNamespaces(namespace_set)

Record the set of namespaces that should not be loaded from an archive.

The expectation is that any required entities in the namespace will be defined by loading schema.

addImportAugmentableNamespace(namespace)

Mark that the specified namespace may be imported by new bindings.

Normally namespaces that are available from archives are considered to be complete, and schema locations in import directives are ignored. Use this to indicate that the bindings being generated import new bindings.

Note that attempts to import schema that contributed to the archive will only be detected if the archive was generated from the same schemaLocation URI; if the archive was generated from a different source component definitions might conflict.

addLocationPrefixRewrite(prefix, substituent)

Add a rewrite entry for schema locations.

:param prefix : A text prefix that should be removed from schema location URIs.

:param substituent : The text prefix that should replace prefix as a prefix in a schema location URI.

addModuleName(module_name)

Add a module name corresponding to an entrypoint schema.

The namespace defined by the corresponding schema will be written to a binding using the given module name, adjusted by modulePrefix.

addNamespace(namespace)
addNoLoadNamespace(namespace)

Mark that the specified namespace should not be loaded from an archive.

Use this when you are generating bindings for an application that has a restricted profile of a namespace that would otherwise be read from an archive. Be aware that this removes any knowledge of any archive in which this namespace is present as a non-private member.

addSchema(schema)
addSchemaLocation(schema_location, converter=None)

Add the location of an entrypoint schema.

Parameters:schema_location – The location of the schema. This

should be a URL; if the schema location does not have a URL scheme (e.g., http:), it is assumed to be a file, and if it is not an absolute path is located relative to the schemaRoot.

Parameters:converter – Optional callable that will be invoked

with the generator instance and the schema location, and is expected to return a pyxb.xmlschema.structures.Schema instance. If absent, the contents of the location are converted directly.

Note:The converter argument derives from WSDL support: we

need to add to the sequence of schema locations a URI of something that will not parse as a schema, but does have inner material that can if treated properly. “Treated properly” may include having the archive path and other namespace manipulations configured before anything is done to it.

allowAbsentModule()

Indicates whether the code generator is permitted to process namespace for which no module path can be determined.

Use this only when generating bindings that will not be referenced by other bindings.

allowBuiltinGeneration()

Indicates whether bindings will be written for namespaces that are built-in to PyXB.

This must be enabled when building bindings for the XML, XMLSchema instance, and other built-in namespaces. Normally generation of these namespaces is inhibited lest it produce inconsistencies.

applyOptionValues(options, args=None)
archivePath()

A colon-separated list of paths from which namespace archives can be read.

The default path is the contents of the PYXB_ARCHIVE_PATH environment variable, or the standard path configured at installation time. Any file with the extension wxs found in one of these directories is examined to see whether it is a namespace archive.

archiveToFile()

Optional file into which the archive of namespaces will be written.

Subsequent generation actions can read pre-parsed namespaces from this file, and therefore reference the bindings that were built earlier rather than re-generating them.

The file name should normally end with wxs.

argAddLocationPrefixRewrite(prefix_rewrite)

Add a rewrite entry for schema locations.

Parameter values are strings of the form pfx=sub. The effect is that a schema location that begins with pfx is rewritten so that it instead begins with sub.

This applies to schemaLocation attributes in import and include elements. It may be used to convert absolute schema locations into relative ones to allow offline processing when all schema are available in a local directory. See schemaRoot.

argAddSchemaLocation(schema_location)

Add the location of an entrypoint schema. The provided value should be a URL; if it does not have a URL scheme (e.g., http:), it is assumed to be a file, and if it is not an absolute path is located relative to the schemaRoot.

assignModulePath(module_record, module_path=None)

Provide a Python module path for the module record.

This is the path by which the module bindings associated with module_record will be imported.

If a path had already been assigned to the module, it is left in place.

Parameters:
Returns:

module_record

bindingModules()
bindingRoot()

The directory path into which generated bindings will be written. :rtype: str

componentGraph()
componentOrder()
defaultNamespacePublic()

Indicates whether unmentioned namespaces will be public or private (default) in the archive.

A namespace is I{mentioned} if it is the target namespace of an entrypoint schema, or appears in a namespace visibility specification. I.e., this default applies only to namespaces that are modified as a result of including some schema, which is generally a local customization of something.

generateToFiles()
generationUID()

A unique identifier associated with this Generator instance.

This is an instance of pyxb.utils.utility.UniqueIdentifier. Its associated objects are pyxb.namespace.archive._SchemaOrigin instances, which identify schema that contribute to the definition of a namespace.

getCommandLineArgs()

Return a command line option sequence that could be used to construct an equivalent configuration.

Note:If you extend the option parser, as is done by

pyxbgen, this may not be able to reconstruct the correct command line.

importAugmentableNamespaces()

A list of namespaces for which new bindings are allowd.

locationPrefixRewriteMap()

Optional map to rewrite schema locations.

This applies only to the values of schemaLocation attributes in import and include elements. Its purpose is to convert remote or absolute schema locations into local or relative ones to allow offline processing when all schema are available in a local directory. See schemaRoot.

loggingConfigFile()

A file provided to logging.config.fileConfig to control log messages.

In the absence of other configuration the Python standard logging infrastructure is used in its default configuration.

Return type:str
moduleForComponent(component)
moduleList()

A list of module names to be applied in order to the namespaces of entrypoint schemas

modulePathData(module)
modulePrefix()

The prefix for binding modules.

The base name for the module holding a binding is taken from the moduleList, moduleMap, or an XMLNS prefix associated with the namespace in a containing schema. This value, if present, is used as a prefix to allow a deeper module hierarchy.

moduleRecords()

The set of pyxb.namespace.archive.ModuleRecord instances associated with schema processed in this generation instance.

These should be in one-to-one correspondence with the namespaces for which bindings are being generated. Multiple input schemas may contribute to a single module record; all material in that record is placed in a single binding file.

namespaceModuleMap()

A map from namespace URIs to the module to be used for the corresponding generated binding.

Module values are adjusted by modulePrefix if that has been specified.

An entry in this map for a namespace supersedes the module specified in moduleList if the namespace is defined by an entrypoint schema.

Returns:A reference to the namespace module map.
namespaceVisibilityMap()

Indicates, for specific namespaces, whether their visibility in the archive should be public or private.

namespaces()

The set of namespaces for which bindings will be generated.

This is the set of namespaces read from entrypoint schema, closed under reference to namespaces defined by schema import.

Return type:set
noLoadNamespaces()

A frozenset of namespaces that must not be loaded from an archive.

normalizeSchemaLocation(sl)
optionParser(reset=False)

Return an optparse.OptionParser instance tied to this configuration.

Parameters:reset – If False (default), a parser created in a

previous invocation will be returned. If True, any previous option parser is discarded and a new one created. :type reset: bool

resolveExternalSchema()
schemaLocationList()

A list of locations from which entrypoint schemas are to be read.

The values in the list are either URIs, or tuples consisting of a value and a callable which, when passed the generator object and the value, will return a pyxb.xmlschema.structures.Schema instance. See addSchemaLocation.

See also addSchemaLocation and schemas.

schemaRoot()

The directory from which entrypoint schemas specified as relative file paths will be read.

schemaStrippedPrefix()

Optional string that is stripped from the beginning of schemaLocation values before loading from them. This now applies only to URIs specified on the command line so is unlikely to be useful.

schemas()

Schema for which bindings should be generated.

These may be Schema instances, or strings; the latter is preferred, and is parsed into a Schema instance when required.

This is the list of entrypoint schemas for binding generation. Values in schemaLocationList are read and converted into schema, then appended to this list. Values from moduleList are applied starting with the first schema in this list.

setAllowAbsentModule(allow_absent_module)
setAllowBuiltinGeneration(allow_builtin_generation)
setArchivePath(archive_path)
setArchiveToFile(archive_to_file)
setBindingRoot(binding_root)
setDefaultNamespacePublic(default_namespace_public)
setFromCommandLine(argv=None)
setLocationPrefixRewriteMap(location_prefix_rewrite_map)
setLoggingConfigFile(logging_config_file)
setModulePrefix(module_prefix)
setNamespaceVisibility(namespace, visibility)
setNamespaces(namespace_set)
setSchemaLocationList(schema_location_list)
setSchemaRoot(schema_root)
setSchemaStrippedPrefix(schema_stripped_prefix)
setSchemas(schemas)
setUriContentArchiveDirectory(ucad)
setValidateChanges(validate_changes)
setWriteForCustomization(write_for_customization)
uriContentArchiveDirectory()

The directory path into which any content retrieved by URI will be written.

This serves as a local cache, and to give you an opportunity to inspect material retrieved from some other system. :rtype: str

validateChanges()

Indicates whether the bindings should validate mutations against the content model.

writeForCustomization()

Indicates whether the binding Python code should be written into a sub-module for customization.

If enabled, a module path.to.namespace will be written to the file path/to/raw/namespace.py, so that the file path/to/namespace.py can import it and override behavior.

writeNamespaceArchive()
class pyxb.binding.generate.NamespaceGroupModule(generator, namespace_modules, **kw)

Bases: pyxb.binding.generate._ModuleNaming_mixin

This class represents a Python module that holds all the declarations belonging to a set of namespaces which have interdependencies.

_GroupPrefix = '_group'
_NamespaceGroupModule__UniqueInGroups = set([])
_NamespaceGroupModule__componentBindingName = None
_NamespaceGroupModule__components = None
_NamespaceGroupModule__namespaceModules = None
_NamespaceGroupModule__uniqueInModule = None
_bindingPreface_vx()
_bindingTagPrefix_vx()
_finalizeModuleContents_vx(template_map)
_initialBindingTemplateMap()
_moduleUID_vx()
moduleForNamespace(namespace)
namespaceModules()
class pyxb.binding.generate.NamespaceModule(generator, module_record, mr_scc, components=None, **kw)

Bases: pyxb.binding.generate._ModuleNaming_mixin

This class represents a Python module that holds all the declarations belonging to a specific namespace.

classmethod ForComponent(component)
_NamespaceModule__ComponentModuleMap = {}
_NamespaceModule__componentBindingName = None
_NamespaceModule__components = None
_NamespaceModule__moduleRecord = None
_NamespaceModule__namespace = None
_NamespaceModule__namespaceGroup = None
_NamespaceModule__namespaceGroupHead = None
_NamespaceModule__namespaceGroupModule = None
_UniqueInModule = set(['sys', '_module_typeBindings', 'CreateFromDOM', 'CreateFromDocument', 'pyxb'])
_bindingPreface_vx()
_bindingTagPrefix_vx()
_finalizeModuleContents_vx(template_map)
_initialBindingTemplateMap()
_moduleUID_vx()
bindComponent(component)
componentsInNamespace()
moduleRecord()
namespace()
namespaceGroupHead()
namespaceGroupModule()
namespaceGroupMulti()
setNamespaceGroupModule(namespace_group_module)
pyxb.binding.generate.PrefixModule(value, text=None)
class pyxb.binding.generate.ReferenceEnumerationMember(**kw)

Bases: pyxb.binding.generate.ReferenceLiteral

enumerationElement = None
class pyxb.binding.generate.ReferenceExpandedName(**kw)

Bases: pyxb.binding.generate.ReferenceLiteral

_ReferenceExpandedName__expandedName = None
class pyxb.binding.generate.ReferenceFacet(**kw)

Bases: pyxb.binding.generate.ReferenceLiteral

_ReferenceFacet__facet = None
class pyxb.binding.generate.ReferenceFacetMember(**kw)

Bases: pyxb.binding.generate.ReferenceLiteral

_ReferenceFacetMember__facetClass = None
class pyxb.binding.generate.ReferenceLiteral(**kw)

Bases: object

Base class for something that requires fairly complex activity in order to generate its literal value.

_ReferenceLiteral__literal = None
_ReferenceLiteral__ownerClass = None
_addTypePrefix(text, **kw)
asLiteral()
setLiteral(literal)
class pyxb.binding.generate.ReferenceNamespace(**kw)

Bases: pyxb.binding.generate.ReferenceLiteral

_ReferenceNamespace__namespace = None
class pyxb.binding.generate.ReferenceSchemaComponent(component, **kw)

Bases: pyxb.binding.generate.ReferenceLiteral

_ReferenceSchemaComponent__component = None
class pyxb.binding.generate.ReferenceWildcard(wildcard, **kw)

Bases: pyxb.binding.generate.ReferenceLiteral

_ReferenceWildcard__wildcard = None
class pyxb.binding.generate._CTDAuxData(ctd)

Bases: object

Helper class holding information need in both preparation and generation.

classmethod Create(ctd)
classmethod Get(ctd)
automaton = None
contentBasis = None
ctd = None
edMultiples = None
edSingles = None
termTree = None
pyxb.binding.generate._GenerateAutomaton(automaton, template_map, containing_state, lines, **kw)
class pyxb.binding.generate._ModuleNaming_mixin(generator, *args, **kw)

Bases: object

classmethod BindComponentInModule(component, module)
classmethod ComponentBindingModule(component)
classmethod _ForRecord(module_record)
_ModuleNaming_mixin__ComponentBindingModuleMap = {}
_ModuleNaming_mixin__RecordModuleMap = {}
_ModuleNaming_mixin__anonCTDIndex = None
_ModuleNaming_mixin__anonSTDIndex = None
_ModuleNaming_mixin__bindingFile = None
_ModuleNaming_mixin__bindingFilePath = None
_ModuleNaming_mixin__generator = None
_ModuleNaming_mixin__modulePath = None
_ModuleNaming_mixin__moduleUID = None
_ModuleNaming_mixin__referencedFromClass = None
_ModuleNaming_mixin__referencedNamespaces = None
_ModuleNaming_mixin__uniqueInClass = None
_ModuleNaming_mixin__uniqueInModule = None
classmethod _RecordModule(module)
_ReferencedFromClass = set(['sys', '_module_typeBindings', 'pyxb'])

Identifiers defined in module that are accessed unqualified from class.

These include standard import module names and globals such as references to namespaces.

_UniqueInModule = set(['sys', '_module_typeBindings', 'pyxb'])

Identifiers that are reserved within a module.

Subclasses extend this with the identifiers they add to the module. Module-level schema-derived identifiers (such as type definition and element names) are deconflicted from this set and from each other.

_bindComponent(component)
_bindingPreface_vx()
_bindingTagPrefix_vx()
_importModule(module)
_initializeUniqueInModule(unique_in_module)
_moduleUID_vx()
_referencedNamespaces()
_setModulePath(path_data)
addImportsFrom(module)
bindingFile()
bindingIO()
bindingPreface()

Return a block of binding text (comment or code) serving as a preface.

Normally this should describe the module contents.

bindingTag()

Return a distinct string recorded in the first 4096 bytes of the binding file.

This is used to ensure uniqueness and avoid overwriting data belonging to a different binding. The return value comprises the class-specialized _bindingTagPrefix_vx with the moduleUID.

defineNamespace(namespace, name, definition=None, **kw)
generator()
importForDeclaration(decl)

Import the binding from which the declaration came.

Figure out where the declaration came from. If it’s not part of this binding, make sure we import the binding associated with the schema from which it came. We need that, if not for something in the declaration itself, at least to be able to get the Namespace for the declaration’s name. None of this is relevant if the declaration has no namespace.

literal(*args, **kw)
moduleContents()
modulePath()
moduleUID()
nameInModule(component)
pathFromImport(module, name)

Python code reference to an object in an imported module

referenceNamespace(namespace)
referenceSchemaComponent(component, in_class=False)
uniqueInClass(component)
uniqueInModule()
writeToModuleFile()
pyxb.binding.generate._PrepareComplexTypeDefinition(ctd, generator, nsm, module_context)
pyxb.binding.generate._PrepareSimpleTypeDefinition(std, generator, nsm, module_context)
pyxb.binding.generate._SetNameWithAccessors(component, container, is_plural, binding_module, nsm, kw)
pyxb.binding.generate._VCAppendAuxInit(vc_source, aux_init, binding_module, kw)
pyxb.binding.generate._useEnumerationTags(td)
pyxb.binding.generate.elementDeclarationMap(ed, binding_module, **kw)
pyxb.binding.generate.pythonLiteral(value, **kw)
pyxb.binding.generate.simpleTypeOwnedEnumerationFacet(std)

pyxb.binding.saxer module

This module contains support for generating bindings from an XML stream using a SAX parser.

class pyxb.binding.saxer.PyXBSAXHandler(**kw)

Bases: pyxb.utils.saxutils.BaseSAXHandler

A SAX handler class which generates a binding instance for a document through a streaming parser.

An example of using this to parse the document held in the (unicode) text value xmlt is:

import pyxb.binding.saxer
import io

saxer = pyxb.binding.saxer.make_parser()
handler = saxer.getContentHandler()
saxer.parse(io.StringIO(xmlt))
instance = handler.rootObject()
_PyXBSAXHandler__XSITypeTuple = ('http://www.w3.org/2001/XMLSchema-instance', 'type')
_PyXBSAXHandler__domDepth = None
_PyXBSAXHandler__domHandler = None
_PyXBSAXHandler__rootObject = None
_PyXBSAXHandler__trace = False
endElementNS(name, qname)
reset()

Reset the state of the handler in preparation for processing a new document.

Returns:self
rootObject()

Return the binding object corresponding to the top-most element in the document

Returns:An instance of basis._TypeBinding_mixin (most usually a

basis.complexTypeDefinition.

Raises:pyxb.[UnrecognizedDOMRootNodeError – No binding could be found to

match the top-level element in the document.

startElementNS(name, qname, attrs)
class pyxb.binding.saxer._SAXElementState(**kw)

Bases: pyxb.utils.saxutils.SAXElementState

State required to generate bindings for a specific element.

If the document being parsed includes references to unrecognized elements, a DOM instance of the element and its content is created and treated as a wildcard element.

_SAXElementState__XSINilTuple = ('http://www.w3.org/2001/XMLSchema-instance', 'nil')
_SAXElementState__attributes = None
_SAXElementState__bindingInstance = None
_SAXElementState__constructElement(new_object_factory, attrs, content=None)
_SAXElementState__delayedConstructor = None
_SAXElementState__domDepth = None
_SAXElementState__domDocument = None
_SAXElementState__elementBinding = None
_SAXElementState__enclosingCTD = None
enclosingCTD()

The nearest enclosing complex type definition, as used for resolving local element/attribute names.

Returns:An instance of basis.complexTypeDefinition, or None if

the element is top-level

endBindingElement()

Perform any end-of-element processing.

For simple type instances, this creates the binding instance. :return: The generated binding instance

endDOMElement()

Actions upon leaving an element that is part of a DOM subtree.

enterDOMMode(attrs)

Actions upon first encountering an element for which we cannot create a binding.

Invoking this transitions the parser into DOM mode, creating a new DOM document that will represent this element including its content.

inDOMMode()
setElementBinding(element_binding)

Record the binding to be used for this element.

Generally ignored, except at the top level this is the only way to associate a binding instance created from an xsi:type description with a specific element.

setEnclosingCTD(enclosing_ctd)

Set the enclosing complex type definition for this element.

Parameters:enclosing_ctd (basis.complexTypeDefinition) – The scope for a local element.
Returns:self
startBindingElement(type_class, new_object_factory, element_decl, attrs)

Actions upon entering an element that will produce a binding instance.

The element use is recorded. If the type is a subclass of basis.simpleTypeDefinition, a delayed constructor is recorded so the binding instance can be created upon completion of the element; otherwise, a binding instance is created and stored. The attributes are used to initialize the binding instance (now, or upon element end).

Parameters:
  • type_class (subclass of basis._TypeBinding_mixin) – The Python type of the binding instance
  • new_object_factory – A callable object that creates an instance of the type_class
  • element_decl (basis.element) – The element use with which the binding instance is associated. Will be None for top-level elements
  • attrs (xml.sax.xmlreader.Attributes) – The XML attributes associated with the element
Returns:

The generated binding instance, or None if creation is delayed

startDOMElement(attrs)

Actions upon entering an element that is part of a DOM subtree.

pyxb.binding.saxer.make_parser(*args, **kw)

Extend pyxb.utils.saxutils.make_parser to change the default content_handler_constructor to be PyXBSAXHandler.

pyxb.binding.xml_ module

Binding classes for types referenced by the attribute and attribute group declarations in the XML namespace (http://www.w3.org/XML/1998/namespace).

The content of this module was generated by PyXB and is coupled to the components defined in pyxb.namespace.builtin._XML.

class pyxb.binding.xml_.STD_ANON_emptyString(*args, **kw)

Bases: pyxb.binding.datatypes.string, pyxb.binding.basis.enumeration_mixin

No information

_CF_enumeration = <pyxb.binding.facets.CF_enumeration object>
_ExpandedName = None
_STD_ANON_emptyString_FacetMap = {<class 'pyxb.binding.facets.CF_length'>: <pyxb.binding.facets.CF_length object>, <class 'pyxb.binding.facets.CF_whiteSpace'>: <pyxb.binding.facets.CF_whiteSpace object>, <class 'pyxb.binding.facets.CF_enumeration'>: <pyxb.binding.facets.CF_enumeration object>, <class 'pyxb.binding.facets.CF_minLength'>: <pyxb.binding.facets.CF_minLength object>, <class 'pyxb.binding.facets.CF_maxLength'>: <pyxb.binding.facets.CF_maxLength object>, <class 'pyxb.binding.facets.CF_pattern'>: <pyxb.binding.facets.CF_pattern object>}
emptyString = u''
class pyxb.binding.xml_.STD_ANON_lang(*args, **kw)

Bases: pyxb.binding.basis.STD_union

Simple type that is a union of pyxb.binding.datatypes.language, STD_ANON_emptyString

_CF_enumeration = <pyxb.binding.facets.CF_enumeration object>
_CF_pattern = <pyxb.binding.facets.CF_pattern object>
_ExpandedName = None
_MemberTypes = (<class 'pyxb.binding.datatypes.language'>, <class 'pyxb.binding.xml_.STD_ANON_emptyString'>)
_STD_ANON_lang_FacetMap = {<class 'pyxb.binding.facets.CF_enumeration'>: <pyxb.binding.facets.CF_enumeration object>, <class 'pyxb.binding.facets.CF_pattern'>: <pyxb.binding.facets.CF_pattern object>}
_STD_ANON_lang__SimpleTypeDefinition = <pyxb.xmlschema.structures.SimpleTypeDefinition object>
class pyxb.binding.xml_.STD_ANON_space(*args, **kw)

Bases: pyxb.binding.datatypes.NCName, pyxb.binding.basis.enumeration_mixin

No information

_CF_enumeration = <pyxb.binding.facets.CF_enumeration object>
_ExpandedName = None
_STD_ANON_space_FacetMap = {<class 'pyxb.binding.facets.CF_enumeration'>: <pyxb.binding.facets.CF_enumeration object>, <class 'pyxb.binding.facets.CF_pattern'>: <pyxb.binding.facets.CF_pattern object>}
_STD_ANON_space__SimpleTypeDefinition = <pyxb.xmlschema.structures.SimpleTypeDefinition object>
default = u'default'
preserve = u'preserve'

Module contents

Material used to generate and execute bindings generated by the PyXB package.

PyXB-1.2.6/doc/html/maintref.html0000644000175000017500000005342113152762222016103 0ustar pabpab00000000000000 Maintainer Reference — PyXB 1.2.6 documentation

Maintainer Reference

Git Repository

PyXB is developed using git with active development hosted on Github. Public development is mostly done on the next branch, which is the default for cloned checkouts. The master branch contains material integrated into the release, and follows next. Tags for each release are in the format PyXB-X.Y.Z.

Bug fixes with unit tests are pushed to the next branch as soon as they are fixed. Users whose reported issues have been fixed are encouraged to use the development branch until the fix has been made available in a tagged and packaged release.

Coding Practices

The practices described herein are intended to be used, but evolved over time, and not all are followed in every situation.

Style

PyXB follows generally uses a coding style consistent with those described in the Python coding standard in PEP 8. Specific exceptions are listed below.

Whitespace

The pet peeves of PyXB’s maintainer differ from the BDFL‘s when it comes to whitespace. Spaces are used around operators to reveal precedence assumptions, and sometimes around parenthesis to distinguish tuple value boundaries:

hypot2 = x*x + y*y
pair_of_pairs = ( (a, b), (b, c) )

Definitions of methods and classes always use a space before the parenthesis; invocations never do:

def declaration (self, recurse=False):
   if recurse:
       self.declaration(False)

Naming

PyXB heavily uses a single leading underscore as an indication of protected/friend status, as suggested in PEP 8. Wherever possible, double leading underscores are used to hide class member fields, restricting access to them through protected or public accessor methods.

Class members that are specifically class (as opposed to instance) members begin with a capital letter.

An underscore is used to separate the descriptive class or function name from a suffix that indicates its use. Standard suffixes are:

  • mixin : A class that does not stand alone, but is a superclass of one or more classes
  • csc : A method that uses cooperative super calling
  • vx, vb : An indication that the method is expected to be overridden in a subclass.

Exceptions

PyXB provides a standard exception hierarchy that extends the one built into Python.

Where an execution branch has been identified that requires behavior that has not yet been implemented, raise an pyxb.exceptions_.IncompleteImplementationError. At the current stage of development, these should be extremely rare.

Where the system detects that a precondition is not satisfied, processing must stop. If the precondition failure is due to improper use of the PyXB internal or public API, a pyxb.exceptions_.LogicError should be raised. If the precondition failure is due to invalid input from the schema, a pyxb.exceptions_.SchemaValidationError should be raised.

If the precondition is inexplicably false, Python’s assert functionality may be used. Use of assert should be rare, and only in places that are guaranteed to be exercised during the course of testing.

The exception behavior of methods SHOULD be documented. Documentation of asserts is not required.

Annotations

Use decorators (PEP 318) to mark class methods. Note that this restricts us to Python 2.4 or later. Sigh with disappointment and move on.

Documentation

Use Sphinx-compatible documentation for all public and implementation-shared methods and classes. (Formerly, this was “Use the Epytext Markup Language” but epydoc hasn’t been updated since before PyXB was born. Few if any modules have been converted. ) (Formerly, this was “Use docstrings PEP 257”. Documentation in only a few modules has been converted.)

Comments

Use comments copiously. Do not duplicate detailed information from standards, but do include pertinent summaries and a reference to the section in which the details can be found. The casual reader should not be forced to open the standard to figure out what the coder intended to accomplish.

Terminology

The term “attribute” has different meanings in Python and XML.

tag : Refers to the text that opens an XML element

instance : [as an adjective] Refers to a characteristic of an instance of a Python class.

class : [as an adjective] Refers to a characteristic of a Python class itself, shared among all instances.

field : Refers to a named attribute of a Python object (class). When the attribute holds a value, it is an “instance (class) variable” or “instance (class) field”. When it holds a reference to an invokable object, it is an “instance (class) method”.

Use of new-style classes

Too many things, such as clean hooking into the pickling system, require the use of new-style classes. Namespaces, schema components, and types (simple and complex) all use new-style classes.

For this to work properly, if you implement an __init__ method, it must take arbitrary args and keywords, invoke super(Class, self).__init__(*args,**kw), and extract any arguments it needs from the keywords. If you do not need to do anything in the init method, leave it out. See this commentary for a detailed description of the intricacies of super.

Inheritance

Mix-in classes

PyXB makes heavy use of multiple inheritance through mix-in classes. If there are constraints on where the mix-in must appear in the method resolution order (mro), note that clearly in the mix-in documentation.

Invoking Superclass Instances

Cooperative super calling is a pattern where a class may inherit multiple implementations of the same method, and want to call all of them. Normally this is done by invoking the parent class implementation before or after the subclass implementation. In non-trivial inheritance hierarchies (as result from using many mix-ins), it’s not obvious who the next parent to call is, so the Python super function is used. However, at some point a class will be reached that has no more definitions for the called method, and attempting to invoke one would produce an AttributeError.

Use the following idiom to conditionally invoke superclass methods when you are not sure the superclass has such a method.

def method_csc (self, *args, **kw):
    super_fn = getattr(super(ThisClass, self), 'method_csc', lambda *a,**kw: self)
    return super_fn(*args, **kw)

Note the use of the _csc suffix to highlight that this method uses cooperative super calling.

Class Variables At Multiple Levels

There are several cases where we want to store information in a class, but allow subclasses (not instances) to override it. An example is in the pyxb.binding.basis.simpleTypeDefinition hierarchy where each class maintains a set of pyxb.binding.facets.ConstrainingFacet instances that are available for constraining values of the class. In many cases, a subclass will not change the set of facets that affect instances, so we want to be able to inherit the parent class map; but in other cases we may need to add constraints that only affect the new class and its descendents.

This sort of thing is supported by implementing a private class method in the base class which combines the dynamically-determined actual class name with a constant identifier and uses getattr and setattr to access the class-specific value.

Type declarations may extend a type of the same name in a different namespace. If they do so, their binding classes will likely have the same name, but in different modules, while also inheriting (in exactly the situation where we want different values). For this reason, the constructed attribute name should also incorporate the module or namespace, something normally not done with the double-underscore feature of Python.

PyXB-1.2.6/doc/html/objects.inv0000644000175000017500000005430413152762225015563 0ustar pabpab00000000000000# Sphinx inventory version 2 # Project: PyXB # Version: 1.2 # The remainder of this file is compressed using zlib. xŝ[s8S8bfcٙ ҶoeY IHf'Eҗ / "2:Ҧ[x! ˘~~}\<󿜝 ~\\Wاf畅y~u(,I ȉ_uB ? R<>Mbr IL$(4' %36:I~{GGO$LE秽szTBgTRQ􃔟_VÝIw{\$^]]W4I}7Ixެn1Ax'VNvqIX{ua5KQV LP)'vÔ)a<Ǖ5X'=oO\|>l8+O6ereKO}X 6WA΃A^@m4VW-&!J0=$6_gLw )TE8gGF&bv(yD~IyB'\iu5@#Rl/8v_ixT g~Q54}3ɋ|/, _!uA۷yQu['? ŵAs^ɛYn%!/VȷfĠ%"ɾxBzHhGYl).hSyT@zu1UAkMo: =C(}2sQ5WϜ?h?R?AnC#R .k 4?%tqcy{IB[b5uvPr4ܼsƷ~N.Ķ|OX IW:X3%JmGT2]Y,:# =t<`,EUh0+g*i'ha1Y6[Ȗj=tT;pYui&23Cf=PǐHrSM#UM7u0m RΘ9@X-{戃ذaǫQuҜF P ZSsVπg2ph{@E5Vm=kbI!@ UkdL{cIiᛩd| |Gbۍ*17M|~oKsv2ԝP f܉΁p؂P=~ u-]NyϏpIPQhDQ7yjzo)yC)^>zaMZ.g}l/\'k9a&l19`um XUENʮ_ /: o?Fitwy`G:cؑ2F EAgy=2TrY:l) &]JU}T|sçef1ߵTߚcׂjlj0%+Zlp f3+M|%-lqGCTvv&!)oID6R/?`?0|}]Nv$gXh\~\pO>0P_k\=U꽓yA}#O4 ~v.st咽|G$+#K CN:w$y 4~&þ(Vmx {dHT5gLh-8Z*BX]X)c-DL;8Q"L6XL *񪖃6 Ϊ+Eq_2{|4]D]!wvhʃ88eN?kw5(tP6srk䋛WaTR4+ ?+y!w[W~2HyOc*z4?EqJQ ^tEқm8#Ek| ϼSmukT9NeZ"U7F }X^nʏQGU.=9To&~mdq@EޑS&̬ ً{FNXRKeɞuڅWz&dcY13lEqdv(_ˋ/) Vh6z^mf!`-?y4%V ^QFf Cr`1 Yt-] =SG?1߿4%9lח_}dՂ7o>](H@g0] t M(8P'Q-A԰w9,;̒j+kj;cuc^72=rjvj"zjdȗ!lӁtnvh2!}Ev}kay* -*-*-$F[T$D[T J[&ie~)8Tock`o 竽߬C=fIߚ&2-`q[*< q- dek D1zlMC-xh?e~Y4q_$~}jnކ(Ӱe)"ѭlT[iۈxmES8?ӄ8Qp鿁KA_Q9}E^i}rdxC?_@G^1 {# QrW0<-N.mHZX dzKf`iS b,@A=H w~EV][ rw"8 1S{' >>Mc'ݻL+ LJk$Nk"Ljdk/[ahqIgbBqU.pM}nQ84YY"*Z%bNKtQͻ!"nY\Ƀ~$5?&iw%;NwꩿIސ MBN2)(l#?Z}sa?dooH>der9n((XT1jHRe< ЀJ&ԈJ$I" nO,d%=;%l40;(H@'BͧWQAaXQBAvNLr) +"-\( j&| 4%%Nb{3'cSّ fE:Lx>!6šԽ"ԲN*xCf7 @ǡ*=*w0Q*  747倦th1n..[px}e 8~1YZb]!wqƝH Z"S 1VVAKDG@@uoJ+_xb4@֨DLsl(Q<"4F`"q86Jڔ*7@lp4e-&H[&L;Lx>!zP]q]a]`]&5\q.&8t|"ߍ.rS|tB[$ׯLA}䀙ੱ&!_EE^Es QRu ĩT\`-q_' £pJ³px/_bmWPkp߼ OrnCMv-iTf.ӲDŽl2vK ]a&Ka&kqi^ؖL# A}ւ vlհ`텟ffxzh@]0 ـ$؈$_4O7_oY`a"\ZUS:Nnbao(.ao`^F=pXQS{Tir u|\Mh1xVw)@CBGN}GG~`ޟ$0EG!ǟC6u p/>+d[C JnݷݴPO~N Vef #,,˜lm\VTmT"5;SZxSu%^Ր]'"%-mW+H@^a*W;GѶ;v0~K?R{)gs^ /|zK+)@S߈gp$r$=*_T{hٖ*k-dXuSE-tpSkozLiQs5fF)+K{L_fajjLޡ) x@S'! ˘I%t>x1gԘ=]NvѫG+#I!9gp!'c"ֆ1`詎Hbe٫tSf$ &P_GhϕF߫vs|8=UWD6OiR<*ʟ`| Zdpjw1]EUJ+b܍%` \MX?rfTl*]wЕb]E]X;ޫi6ŪHA땝7̧^\ 6+?MvWT/V+ U_^0@[(yҫsB^J6z+贡[{CztS|\gTwƸQTpk;/fT-7ye\Dܮ &l'떠p A:kva {&̰acxa9QR|?KU c W}1y~H7D=%1kkmz[ @ϐ'7T|ޏ4FD%סJQξ|q"r,bfxHn}Uz\l֥ՐPe%J>ydb5!l$aN-ZQwɺ$Bӗn jj%!_YAc<9"i 1FƸoxލkiYy}1!1O?1=b5󲺼}ugbF=Cl"@|=:A0vgxVVz-3O+ :xގbѼ_+iئ L@ܺU A ɸ%id6):$u&, k ywy/FVk,IzrB_L\bB":g"x2^|ۧ|Ӝ{7l{= `(yjJmM+ i3JHrID$vIknש׽vf^U}b{əkYp|҂yy{F(nOر$uh%ǀ9ewq9]h lK6'Ă,RI^(+ i[Q8inځ7wtp4rf+78}x"QR=6ߓOѳ3 ߦ>ܨ3&iZϞob)O`|R#('4pX?W=3@埙a'[VukxN/z7X Z N%ęTVSL#㪵orda} &c?/tĎ2Uq'G^5 ^ޗ/FJJT8;+SvZ|+t |ؕvzA (YsABe.rʙ<^֛=6:Fm %Noh̎:h1^̕S70{L4v>2xt'ifͼד ܜR &y-s\ڡD,7--=PJ3l\=Zp=+zOjEfAq඄0Q4&?X,џdX8)п3En6/3ͯ8lP-g_`H oBl uB2x &1 RVIqwʢZ I쿑pYKsemRTz5TR);E89}*u1\25'Fn cj@\|^I m8߈5Al_gһ!++g5Eݪ UGznō}˚x5Pt@hK\fG`Dk@:7d RC7 m;xVܡР>~o׀_J#CY%4+T#cگz}$aqC"AHshh ϫIIX'Fı`Fͫ~:Ĵq`ϳ(j~;ݤ>I+P@"1~kf X;?]/'jaѷc{X"F&*Ƿ@5;]bDqEr3 xgؤ*MB1m0c8RZ'-Z֚#O6-x%!dlD]y}v1Pe#İC5kN ;&'!%Q'JQ`vㅚ1^i қ!Ȥ3ax꜋#rsB(5Jʼ!)3`1~qc3gY2Q X-sfQCE5$z7{[!h$U2L6ϘmrkĻ<}V1_dy"kL||.=-ro-Ю&F}!95W~j',. uDc{=i$MĽ^sY&7HoCȵvNވh\{.@=sS{<;ǫ9'$ybUfc1~\dI|i 8y8eHHR- (dn ]c8*,ceЪѢٕD.p%!\# gx|{JQP.K_-y1kOCtXUmFgLhK jNXqb3q_0z]H[/Y5۱e33SKv~?7Ps氉Jlx7A#yPhMŀL3FKRZ\P%$ FnM}6 Wc{G)= 3$nrz tMͦFڸyn>[0"tO\I͡Pmz\ތo0?>FND yCxp*|1Bl#CzMcd}8IJCCӦw2-_4 ; Ķ ZDZFGf(`gܰGJPA881^BO(كưa!B9m(s\~IfҵHZb 6S;c.E%#CSo4+ }Ԃ5:{FGwQ-rn %IXE&oKeXFj% d$ %BOB=ũuUϱDt,M.1# 븰$;8dy1]vuyb #5v ˓X?E,Uv,^:w"1G) hTnWj]PnnV7KGQBjw BGdMJeM7Z'#˄Ι"RU;h0nϱydLTm=8iHcJw]f_`% n8R ]s?ݤ?h~ 1>J4PرaBg˿C_ :6@G|G4lX>%FZRN&Bk(Oy}ս *!2osKo4=q bQA N[J\Iy0]r@{N*/>m,}}w~\{qO}0#6l>P< 3٦ -rX3V A99Ĺj3թJdvwfT}ЌðށH;kIHфfL_7ˈڄ4Z&-,6!/6ki8o.Hrz QK] ; +9ri_҈3)2aB=di]0l^=6; ^qؓ?S&ɠͦ_gH}?~Uo_ȳ a=w(pxö\`u~抰j~In87ƴ{-.C`nXZbI'Q ZM:SEUh/ qNZg-^웞~2Gd ly?ҍ)L g9)܊>67E]G_j#Й>A[,<|Y SD\n8R]9ŗ%߻íIx'Ǖ3:xyzcY+Q/\H`![$5ðӴZzJ!RsizO#>JUbO?wwMB)vQ=lL ;gft)H^OlT[0Z]$ ]DCc]bv+^fzi])͝P5F! GIJ;lJ0^13m#JFoHz)Q{Dz~pR{M*CEGq'\tf%w1fLr{"3SwZ#`:Z[)>=M|r#Ŏsq] s#Nyuw#+!$0gBWmOqDG0cc džyCP‡2#ZyF5 y}*]8z9Rs7v,Cc}?ԋ$(u)[鲯{0=~CtQ^uy{)3ޏ ť& #XP~č{Gwԝ0iae0)?^HNVr8z`qztL7 ̀a]+2pb݌)RDYjFe!emIӨHEЅK"tiC{V3bvz\|oZDc/V6" + 40"?qiSׂ 5 ax+|!c ԯ>I$I%1,q[0cZ}2O Dl n󉼗f5 Nߦ7K*E5fߒFeN)IaCH8o}'qYH__[x͏Vyz>cFbY SaƃEg,2cI+ jр5EAF-y [7^~8H5X}G8B.H`6Vyy Hvt(y&8J[)]7}FSiv'!;~ϭ&qʏ3M;Xi29宦]x_=W1Il>pW5ũESlXneӕ jC:4 `n`_P [(H(R>|#Jˏgl؜Hb4csϓ6j&&3} Z#0M c)sU-p[ǥ{Ӄ@Udw>y}"}jQ4)Ш:%.Ї3@d@\A}?c;4lNQ ^k4Jct0`xǧfZ:aBInhӛD!Ԧq92."ĴQI B#ȺweA-&5ЏNڪR_eZeim&Rt2LudPgBfy^l e.WqbOVdPKͧAT\cm(ηi}Q3B}I_g}N~be=a&ɰs_,sTE+pHULm@泋*[ =H/ըfŊu_646<~ :f:_,|q?ALsGugS>V^{`cm(-RکP7(hrh")$?fc?JCxL7̢3F0]G4멵$[2u n]2QY4 ~C(I2{)[RCZZ(ɍtMomjV,SbϽ'ӱZ6BZ%EfK˚emh;t`k8t$7qUbmXq5r8E?l`ԀU+2tUt3(}3܉A!b[zXVl5#^ cmQBk{Ј.DndZy\Vw mBqZ3?Qy#}o$oHhz&S?CAQNAmX ~o%<6!o`pc@LA-/_uCT FEGi }Y)@.DP,\qј2:sgMv3=Pb1+)uG6T aug3+dŐeP)ı\ o7!(.ӝnz20O6':0]2$P(7h9Ǵ%,v҅w-Կ YYY;qe:'*O_$@}LPW}ko38[YbxG>yG30BYzb̧x"[2i"1-ږzMWd-6M7O)jlWB~nܐ܀ųbU㄄F!(X 1aNH|.6YKYwNL eq/ [t݀Ku2qSM_B4$bcJgoy:+Z p!(ה=M$v=!EnG@ݰmY3? MPy_NՊ~FBFߠ.r!8P;O=V,3McҜ n,&L I*!{Dâ!b 2'0D~6vuR0W 7#=I/h0huK [4>au/Eq o|'3)u欏+P 3s:M5x^A0ݏg/pO߈g)DA}Co70vkQwSἀ0s@(*&3OT4#(zdɓ3\u7 Bh YJJsVٚ %hٿA$sx w:z%.?#0F?iB N.7KϾhnW ;Sw%QV6& ia)LfE6a*1!zs \y`|rGaܮlyUZw?y^pd(!a>Lizht@Nܔh:a(!xh!Xw> yQkY|].{bʐk0IGIO{j|P{WLO3}ZV]="c |zmY4i\ mG謆Xi/h@Tx\PxWeDI@M{?Fx~.i_2 6r^@r"Z]{B=X-Q]86/7fsF.m:|>pKEsFBBbDv?2BfAs1ɵlE0Yyi&})z R\*)疻#Q+έ¿ D46΂I [(N P/ _ByCQUcFz;wZbVWֻs}uɿ^]]:owW+g.^GY38Ƥ|Tj<#Oz|] R_]wrM^42\1S@MxLdp~9vH2_EE}!(?-p1XFq%O=~w +VfQWڹСD<.}SfK ,Oy<r~mDBRvNݍȠ׉rqu3\رÈq#f  ~> 0tt$c1&j|8iQXqIO[L gzo[igbQLJ?tB0^F'ŏy17F2|nG/B Wij7%aAn=x4SdfRz=F =ܬ{X9M&#wC4r20뒩>߾s#|dGrrH뼐$ ?wJb#3sraI=JLk\IΤ\I)jBNQY,+{ޮ+0t}j} nVAgOӈ6ml}KUoUk*ꕔ@, ˒V@GơyU!\x!m7hv:vO€Gw6.̢@4Ch E.mꞪi:Z1ﰠT4lN]WNyȺ1v~lF rp.tRt+. uGlלk 75Dy NꟘM_o%.ڳ%!5z!|LϽ~<\DH­aZxЀw x+!+",=k 7Msy/}M8|p#)؏ ji8Fn.8Ŀ^oqm]g7 kR:))؈Ftɀfk-'7Es.fP !Ox8[.&!R"Z{Hĵ|emFe-⡧ J)|ũZq_.׫?!  qj.GxC.=]Sk.e>f#fJB|".HFHk?L5}BSg,.wbGEU7w~KKWO#rۤe`çs7i^@n*)ۀuR z%EA^OҗDqw\!ɿWJ-菒ܜͳhZ8XHZeW#xQQ6!tpяX'!D_83n}a;XHhqD )*ɧJ'@*n4&Ew ^ŋHi%s GƞwJ 0q-u_x@1A7];"ߵޙ@G%9yT/v<$ϣ; :n`#hE7,'*4~ʨ^Uv!IN'l]Œ EBcg'gQ =$d4e41C ȭs?Je/*ŗe}aGEWܗcw{@;”7TƻBI{+-G8੍:م<칽? YƨJ.3$;ߓD, \HfN$Ӡ^=qؔҗ~/2m{;L'ЪI+)KJ^yI{)$δ 2хFXYjG+F(Y|弛64?[ief󳓒(c%iR^d1ւz52 c›š_OU󖿜Wa~B%>a ^/o3vQ@ξ^_{,'V]ݙQ嬹F2g2G}f"NOCO'\\_I_(rO[U;Z9[ۤˬtEeȎryT*'lVRu~m_?4&o<;Md׷Ap/װڶV[zDѦ:oRնKK^2DBrH j!Qf>BY8?%Ue6^wۓ9A5]T6=b(CW)SPُOEGBJw$Wt⠜߉ϧH~='fgL!@kM2zBG!x{O鋶{&@}'/x~뷶|S|$5jlBήIg?3,*i|庼|KD+b:2u_vu>Bu3goNZ%̷4g;'?0.~* W_` gFⒻ 3GEm3Yoͫ׺sWB EE/ d+k*t@ {/X|X<ۜ >KPә|ǿtv>O[܇p?0ȇ*܇M|3.ݵ&p GAz&b}_!/GA~9ogߎLOV ?Uc? |8?ص(g]rQwQ!L: E(JN@~ggi;:?7d0MdR߼ecBEA(THYD1S%| wzgmEw5 ڝ7f)`d*Hiw򙂨^F:&_xz܏\FGy;7 8jsƓRjy}aY5Ɋls!ӱ$][pZu0OHz'IryerʑBO'hb`.]&'H)G*S~?k3N"%o>91GGWXQ*x4E9 _RkͲJ!{E`uE'IxGFCmӨڸ=$귛t-N[U]=}aٵUT7:_D;@;PTXNQ{Y֡ԯy[*; *Y.ٗ/<bud~ 22H Le}||7ADzJ`*#%, E~?rMPyXB-1.2.6/doc/html/_sources/0000755000175000017500000000000013152762244015231 5ustar pabpab00000000000000PyXB-1.2.6/doc/html/_sources/limitations.txt0000644000175000017500000000533713152762205020333 0ustar pabpab00000000000000Limitations *********** Things That Work ---------------- * Class constants corresponding to string enumeration constraints * Simple and complex type definitions * List and union datatypes * Constraints on (simple) datatypes (e.g., minInclusive, length) * Model groups and attribute groups * Complex content models (all, sequence, choice); minOccurs and maxOccurs * Abstract types, `xsi:type `_, substitution groups * Nillable elements with `xsi:nil `_ * Namespace qualified attributes and elements * Documentation annotations present in the schema are converted to Python docstrings in the generated bindings. * Pattern constraints (as long as the simple type derives from something that is represented as a Python string) Things That Don't Work ---------------------- ...but could someday ^^^^^^^^^^^^^^^^^^^^ * Identity constraints ("key", "unique", "keyref") are stored in the content model, but are not used. * `Wildcard elements `_ are supported in the sense that classes that enable them in the content model provide access to unrecognized values through the :py:obj:`pyxb.binding.basis.complexTypeDefinition.wildcardElements` method. Where the type of the node is recognized, it is converted to a Python binding instance; otherwise, the xml DOM instance is stored. Although namespace constraints are applied when checking for wildcard matches, the process contents attribute of the wildcard is ignored. * `Wildcard attributes `_ are supported in much the same sense as wildcard elements: no constraints are checked, and all are aggregated into the :py:obj:`pyxb.binding.basis.complexTypeDefinition.wildcardAttributeMap`. Values are uninterpreted Unicode strings. ...and probably never will ^^^^^^^^^^^^^^^^^^^^^^^^^^ * The `redefine directive `_ is not supported. * The ability to use templates to customize binding generation was promised in the vision document, but after three years of no plausible use case it is no longer part of the plan. Things That Mostly Work, But They're Ugly ----------------------------------------- * The `duration `_ type is based on the Python ``datetime.timedelta`` class, which works reasonably well for small deltas but does not handle month and year deltas. The PyXB version records that information, but the ``timedelta`` functionality (adding/substracting from ``datetime`` instances) does not incorporate that portion of the delta. Negative durations also may not work properly. PyXB-1.2.6/doc/html/_sources/bundles.txt0000644000175000017500000007543313152762205017437 0ustar pabpab00000000000000.. _bundles: Examples of Supported Schema ============================ PyXB comes with pre-defined *bundles* which aggregate related namespaces into pre-generated bindings that allow you to use them without having to generate and manage them yourself. These bundles also demonstrate the complexity of schema that PyXB is prepared to handle. Not all namespaces have been fully tested, but they are expected to function correctly. Although the generating scripts and infrastructure are part of PyXB proper, not all these bundles may have been pre-built in your PyXB distribution. See `Generating Bundled Bindings`_ for details on building these bundles. .. _bundle_common: common ------ The following namespaces are available in support of general XML use: .. PYXB_ARCHIVE_PATH=${PYXB_ROOT}/pyxb/bundles/common// ${PYXB_ROOT}/scripts/pyxbdump \ | awk '$2~/pyxb.bundles.common/ { print $2, $1; }' \ | sed \ -e 's@^@``@' \ -e 's@ @``\t``@' \ -e 's@$@``@' \ | expand -40 \ | sort \ > /tmp/x ===================================== ========================================================== Binding Module Namespace ===================================== ========================================================== ``pyxb.bundles.common.xhtml1`` ``http://www.w3.org/1999/xhtml`` ``pyxb.bundles.common.xlink`` ``http://www.w3.org/1999/xlink`` ``pyxb.bundles.common.xsd_hfp`` ``http://www.w3.org/2001/XMLSchema-hasFacetAndProperty`` ===================================== ========================================================== .. _bundle_wssplat: WS-* ---- The following namespaces are available in support of web service development: .. PYXB_ARCHIVE_PATH=${PYXB_ROOT}/pyxb/bundles/wssplat// ${PYXB_ROOT}/scripts/pyxbdump \ | awk '$2~/pyxb.bundles.wssplat/ { print $2, $1; }' \ | sed \ -e 's@^@``@' \ -e 's@ @``\t``@' \ -e 's@$@``@' \ | expand -40 \ | sort \ > /tmp/x ===================================== ========================================================== Binding Module Namespace ===================================== ========================================================== ``pyxb.bundles.wssplat.bpws`` ``http://schemas.xmlsoap.org/ws/2003/03/business-process/`` ``pyxb.bundles.wssplat.ds`` ``http://www.w3.org/2000/09/xmldsig#`` ``pyxb.bundles.wssplat.httpbind`` ``http://schemas.xmlsoap.org/wsdl/http/`` ``pyxb.bundles.wssplat.mimebind`` ``http://schemas.xmlsoap.org/wsdl/mime/`` ``pyxb.bundles.wssplat.sawsdl`` ``http://www.w3.org/ns/sawsdl`` ``pyxb.bundles.wssplat.soap11`` ``http://schemas.xmlsoap.org/soap/envelope/`` ``pyxb.bundles.wssplat.soap12`` ``http://www.w3.org/2003/05/soap-envelope`` ``pyxb.bundles.wssplat.soapbind11`` ``http://schemas.xmlsoap.org/wsdl/soap/`` ``pyxb.bundles.wssplat.soapbind12`` ``http://schemas.xmlsoap.org/wsdl/soap12/`` ``pyxb.bundles.wssplat.soapenc`` ``http://schemas.xmlsoap.org/soap/encoding/`` ``pyxb.bundles.wssplat.whttp`` ``http://www.w3.org/ns/wsdl/http`` ``pyxb.bundles.wssplat.wsa`` ``http://www.w3.org/2005/08/addressing`` ``pyxb.bundles.wssplat.wsam`` ``http://www.w3.org/2007/02/addressing/metadata`` ``pyxb.bundles.wssplat.wscoor`` ``http://docs.oasis-open.org/ws-tx/wscoor/2006/06`` ``pyxb.bundles.wssplat.wsdl11`` ``http://schemas.xmlsoap.org/wsdl/`` ``pyxb.bundles.wssplat.wsdl20`` ``http://www.w3.org/ns/wsdl`` ``pyxb.bundles.wssplat.wsdli`` ``http://www.w3.org/ns/wsdl-instance`` ``pyxb.bundles.wssplat.wsdlx`` ``http://www.w3.org/ns/wsdl-extensions`` ``pyxb.bundles.wssplat.wsnt`` ``http://docs.oasis-open.org/wsn/b-2`` ``pyxb.bundles.wssplat.wsoap`` ``http://www.w3.org/ns/wsdl/soap`` ``pyxb.bundles.wssplat.wsp200607`` ``http://www.w3.org/2006/07/ws-policy`` ``pyxb.bundles.wssplat.wsp`` ``http://www.w3.org/ns/ws-policy`` ``pyxb.bundles.wssplat.wsrf_bf`` ``http://docs.oasis-open.org/wsrf/bf-2`` ``pyxb.bundles.wssplat.wsrf_br`` ``http://docs.oasis-open.org/wsn/br-2`` ``pyxb.bundles.wssplat.wsrm`` ``http://docs.oasis-open.org/ws-rx/wsrm/200702`` ``pyxb.bundles.wssplat.wsse`` ``http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd`` ``pyxb.bundles.wssplat.wstop`` ``http://docs.oasis-open.org/wsn/t-1`` ``pyxb.bundles.wssplat.wsu`` ``http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd`` ``pyxb.bundles.wssplat.xenc`` ``http://www.w3.org/2001/04/xmlenc#`` ===================================== ========================================================== .. _bundle_saml20: SAML ---- The following namespaces are available in support of the `Security Assertion Markup Language `_: .. PYXB_ARCHIVE_PATH=${PYXB_ROOT}/pyxb/bundles/saml20// ${PYXB_ROOT}/scripts/pyxbdump \ | awk '$2~/pyxb.bundles.saml20/ { print $2, $1; }' \ | sed \ -e 's@^@``@' \ -e 's@ @``\t``@' \ -e 's@$@``@' \ | expand -40 \ | sort \ > /tmp/x ===================================== ========================================================== Binding Module Namespace ===================================== ========================================================== ``pyxb.bundles.saml20.assertion`` ``urn:oasis:names:tc:SAML:2.0:assertion`` ``pyxb.bundles.saml20.dce`` ``urn:oasis:names:tc:SAML:2.0:profiles:attribute:DCE`` ``pyxb.bundles.saml20.ecp`` ``urn:oasis:names:tc:SAML:2.0:profiles:SSO:ecp`` ``pyxb.bundles.saml20.metadata`` ``urn:oasis:names:tc:SAML:2.0:metadata`` ``pyxb.bundles.saml20.protocol`` ``urn:oasis:names:tc:SAML:2.0:protocol`` ``pyxb.bundles.saml20.x500`` ``urn:oasis:names:tc:SAML:2.0:profiles:attribute:X500`` ``pyxb.bundles.saml20.xacml`` ``urn:oasis:names:tc:SAML:2.0:profiles:attribute:XACML`` ===================================== ========================================================== .. _bundle_dc: Dublin Core ----------- The following namespaces are available in support of the `Dublin Core(R) Metadata Initiative `_. .. PYXB_ARCHIVE_PATH=${PYXB_ROOT}/pyxb/bundles/dc// ${PYXB_ROOT}/scripts/pyxbdump \ | awk '$2~/pyxb.bundles.dc/ { print $2, $1; }' \ | sed \ -e 's@^@``@' \ -e 's@ @``\t``@' \ -e 's@$@``@' \ | expand -40 \ | sort \ > /tmp/x ===================================== ========================================================== Binding Module Namespace ===================================== ========================================================== ``pyxb.bundles.dc.dc`` ``http://purl.org/dc/elements/1.1/`` ``pyxb.bundles.dc.dcmitype`` ``http://purl.org/dc/dcmitype/`` ``pyxb.bundles.dc.dcterms`` ``http://purl.org/dc/terms/`` ===================================== ========================================================== .. _bundle_ecma376: ECMA-376 (Open Office XML) -------------------------- `ECMA 376 `_ aka "Office Open XML" aka "ISO/IEC 29500" is a standard for XML-based office software suite documents, including Microsoft Office 2007 and 2010. This bundle is not populated in the distributed versions of PyXB because it requires some 250MB of space to hold the schemas, generated bindings, and archive files. To build it, set ``PYXB_ROOT`` environment variable to the absolute path of the unpacked PyXB distribution (the directory containing :file:`setup.py`) and run these commands:: cd ${PYXB_ROOT} pyxb/bundles/ecma376/scripts/genbind This will download the schemas from OGC and generate bindings for both sets of namespaces below. Note that there are two incompatible schema sets which share namespaces. Import only one. If you wish to extend the classes in these namespaces, ensure your ``PYXB_ARCHIVE_PATH`` includes only the one you intend to extend. ECMA-376 1st Edition (2006) ^^^^^^^^^^^^^^^^^^^^^^^^^^^ The first edition of ECMA-376 was a transitional version leading to ISO/IEC 29500, but is not compatible with that standard. It may be needed for older documents, including those processed by Microsoft Office 2007. .. PYXB_ARCHIVE_PATH=${PYXB_ROOT}/pyxb/bundles/ecma376/v2006// ${PYXB_ROOT}/scripts/pyxbdump \ | awk '$2~/pyxb.bundles.ecma376.v2006/ { print $2, $1; }' \ | sed \ -e 's@^@``@' \ -e 's@ @``\t``@' \ -e 's@$@``@' \ | expand -70 \ | sort \ > /tmp/x ==================================================================== ========================================================== Binding Module Namespace ==================================================================== ========================================================== ``pyxb.bundles.ecma376.v2006.dml.audioVideo`` ``http://schemas.openxmlformats.org/drawingml/2006/main`` ``pyxb.bundles.ecma376.v2006.dml.chartDrawing`` ``http://schemas.openxmlformats.org/drawingml/2006/chartDrawing`` ``pyxb.bundles.ecma376.v2006.dml.chart`` ``http://schemas.openxmlformats.org/drawingml/2006/chart`` ``pyxb.bundles.ecma376.v2006.dml.compatibility`` ``http://schemas.openxmlformats.org/drawingml/2006/compatibility`` ``pyxb.bundles.ecma376.v2006.dml.diagramColorTransform`` ``http://schemas.openxmlformats.org/drawingml/2006/diagram`` ``pyxb.bundles.ecma376.v2006.dml.lockedCanvas`` ``http://schemas.openxmlformats.org/drawingml/2006/lockedCanvas`` ``pyxb.bundles.ecma376.v2006.dml.picture`` ``http://schemas.openxmlformats.org/drawingml/2006/picture`` ``pyxb.bundles.ecma376.v2006.dml.spreadsheetDrawing`` ``http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing`` ``pyxb.bundles.ecma376.v2006.dml.wordprocessingDrawing`` ``http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing`` ``pyxb.bundles.ecma376.v2006.opc.contentTypes`` ``http://schemas.openxmlformats.org/package/2006/content-types`` ``pyxb.bundles.ecma376.v2006.opc.coreProperties`` ``http://schemas.openxmlformats.org/package/2006/metadata/core-properties`` ``pyxb.bundles.ecma376.v2006.opc.digSig`` ``http://schemas.openxmlformats.org/package/2006/digital-signature`` ``pyxb.bundles.ecma376.v2006.opc.relationships`` ``http://schemas.openxmlformats.org/package/2006/relationships`` ``pyxb.bundles.ecma376.v2006.pml.animationInfo`` ``http://schemas.openxmlformats.org/presentationml/2006/main`` ``pyxb.bundles.ecma376.v2006.shared.additionalCharacteristics`` ``http://schemas.openxmlformats.org/officeDocument/2006/characteristics`` ``pyxb.bundles.ecma376.v2006.shared.bibliography`` ``http://schemas.openxmlformats.org/officeDocument/2006/bibliography`` ``pyxb.bundles.ecma376.v2006.shared.customXmlDataProperties`` ``http://schemas.openxmlformats.org/officeDocument/2006/customXml`` ``pyxb.bundles.ecma376.v2006.shared.customXmlSchemaProperties`` ``http://schemas.openxmlformats.org/schemaLibrary/2006/main`` ``pyxb.bundles.ecma376.v2006.shared.documentPropertiesCustom`` ``http://schemas.openxmlformats.org/officeDocument/2006/custom-properties`` ``pyxb.bundles.ecma376.v2006.shared.documentPropertiesExtended`` ``http://schemas.openxmlformats.org/officeDocument/2006/extended-properties`` ``pyxb.bundles.ecma376.v2006.shared.documentPropertiesVariantTypes`` ``http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes`` ``pyxb.bundles.ecma376.v2006.shared.math`` ``http://schemas.openxmlformats.org/officeDocument/2006/math`` ``pyxb.bundles.ecma376.v2006.shared.relationshipReference`` ``http://schemas.openxmlformats.org/officeDocument/2006/relationships`` ``pyxb.bundles.ecma376.v2006.sml.autoFilter`` ``http://schemas.openxmlformats.org/spreadsheetml/2006/main`` ``pyxb.bundles.ecma376.v2006.vml.main`` ``urn:schemas-microsoft-com:vml`` ``pyxb.bundles.ecma376.v2006.vml.officeDrawing`` ``urn:schemas-microsoft-com:office:office`` ``pyxb.bundles.ecma376.v2006.vml.presentationDrawing`` ``urn:schemas-microsoft-com:office:powerpoint`` ``pyxb.bundles.ecma376.v2006.vml.spreadsheetDrawing`` ``urn:schemas-microsoft-com:office:excel`` ``pyxb.bundles.ecma376.v2006.vml.wordprocessingDrawing`` ``urn:schemas-microsoft-com:office:word`` ``pyxb.bundles.ecma376.v2006.wml`` ``http://schemas.openxmlformats.org/wordprocessingml/2006/main`` ==================================================================== ========================================================== ECMA-376 2e/3e/4e (2008) ^^^^^^^^^^^^^^^^^^^^^^^^ The ISO/IEC 29500:2008 version has distinct transitional and strict hierarchies. Use one or the other. The packaging schema are shared between these versions, and in fact appear to be unchanged from the 2006 schema except for comments and other whitespace in the schema documents. The various editions contain changes intended to increase conformance to ISO/IEC 29500:2008 and the bundle script is configured to build the 4th edition (December 2012). .. PYXB_ARCHIVE_PATH=${PYXB_ROOT}/pyxb/bundles/ecma376/v2008// ${PYXB_ROOT}/scripts/pyxbdump \ | awk '$2~/pyxb.bundles.ecma376.v2008/ { print $2, $1; }' \ | sed \ -e 's@^@``@' \ -e 's@ @``\t``@' \ -e 's@$@``@' \ | expand -82 \ | sort \ > /tmp/x ================================================================================= ========================================================== Binding Module Namespace ================================================================================= ========================================================== ``pyxb.bundles.ecma376.v2008.opc.contentTypes`` ``http://schemas.openxmlformats.org/package/2006/content-types`` ``pyxb.bundles.ecma376.v2008.opc.coreProperties`` ``http://schemas.openxmlformats.org/package/2006/metadata/core-properties`` ``pyxb.bundles.ecma376.v2008.opc.digSig`` ``http://schemas.openxmlformats.org/package/2006/digital-signature`` ``pyxb.bundles.ecma376.v2008.opc.relationships`` ``http://schemas.openxmlformats.org/package/2006/relationships`` ``pyxb.bundles.ecma376.v2008.strict.dml.chartDrawing`` ``http://purl.oclc.org/ooxml/drawingml/chartDrawing`` ``pyxb.bundles.ecma376.v2008.strict.dml.chart`` ``http://purl.oclc.org/ooxml/drawingml/chart`` ``pyxb.bundles.ecma376.v2008.strict.dml.diagram`` ``http://purl.oclc.org/ooxml/drawingml/diagram`` ``pyxb.bundles.ecma376.v2008.strict.dml.lockedCanvas`` ``http://purl.oclc.org/ooxml/drawingml/lockedCanvas`` ``pyxb.bundles.ecma376.v2008.strict.dml.main`` ``http://purl.oclc.org/ooxml/drawingml/main`` ``pyxb.bundles.ecma376.v2008.strict.dml.picture`` ``http://purl.oclc.org/ooxml/drawingml/picture`` ``pyxb.bundles.ecma376.v2008.strict.dml.spreadsheetDrawing`` ``http://purl.oclc.org/ooxml/drawingml/spreadsheetDrawing`` ``pyxb.bundles.ecma376.v2008.strict.dml.wordprocessingDrawing`` ``http://purl.oclc.org/ooxml/drawingml/wordprocessingDrawing`` ``pyxb.bundles.ecma376.v2008.strict.pml`` ``http://purl.oclc.org/ooxml/presentationml/main`` ``pyxb.bundles.ecma376.v2008.strict.shared.additionalCharacteristics`` ``http://purl.oclc.org/ooxml/officeDocument/characteristics`` ``pyxb.bundles.ecma376.v2008.strict.shared.bibliography`` ``http://purl.oclc.org/ooxml/officeDocument/bibliography`` ``pyxb.bundles.ecma376.v2008.strict.shared.commonSimpleTypes`` ``http://purl.oclc.org/ooxml/officeDocument/sharedTypes`` ``pyxb.bundles.ecma376.v2008.strict.shared.customXmlDataProperties`` ``http://purl.oclc.org/ooxml/officeDocument/customXml`` ``pyxb.bundles.ecma376.v2008.strict.shared.customXmlSchemaProperties`` ``http://purl.oclc.org/ooxml/schemaLibrary/main`` ``pyxb.bundles.ecma376.v2008.strict.shared.documentPropertiesCustom`` ``http://purl.oclc.org/ooxml/officeDocument/customProperties`` ``pyxb.bundles.ecma376.v2008.strict.shared.documentPropertiesExtended`` ``http://purl.oclc.org/ooxml/officeDocument/extendedProperties`` ``pyxb.bundles.ecma376.v2008.strict.shared.documentPropertiesVariantTypes`` ``http://purl.oclc.org/ooxml/officeDocument/docPropsVTypes`` ``pyxb.bundles.ecma376.v2008.strict.shared.math`` ``http://purl.oclc.org/ooxml/officeDocument/math`` ``pyxb.bundles.ecma376.v2008.strict.shared.relationshipReference`` ``http://purl.oclc.org/ooxml/officeDocument/relationships`` ``pyxb.bundles.ecma376.v2008.strict.sml`` ``http://purl.oclc.org/ooxml/spreadsheetml/main`` ``pyxb.bundles.ecma376.v2008.strict.wml`` ``http://purl.oclc.org/ooxml/wordprocessingml/main`` ``pyxb.bundles.ecma376.v2008.transitional.dml.chartDrawing`` ``http://schemas.openxmlformats.org/drawingml/2006/chartDrawing`` ``pyxb.bundles.ecma376.v2008.transitional.dml.chart`` ``http://schemas.openxmlformats.org/drawingml/2006/chart`` ``pyxb.bundles.ecma376.v2008.transitional.dml.diagram`` ``http://schemas.openxmlformats.org/drawingml/2006/diagram`` ``pyxb.bundles.ecma376.v2008.transitional.dml.lockedCanvas`` ``http://schemas.openxmlformats.org/drawingml/2006/lockedCanvas`` ``pyxb.bundles.ecma376.v2008.transitional.dml.main`` ``http://schemas.openxmlformats.org/drawingml/2006/main`` ``pyxb.bundles.ecma376.v2008.transitional.dml.picture`` ``http://schemas.openxmlformats.org/drawingml/2006/picture`` ``pyxb.bundles.ecma376.v2008.transitional.dml.spreadsheetDrawing`` ``http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing`` ``pyxb.bundles.ecma376.v2008.transitional.dml.wordprocessingDrawing`` ``http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing`` ``pyxb.bundles.ecma376.v2008.transitional.pml`` ``http://schemas.openxmlformats.org/presentationml/2006/main`` ``pyxb.bundles.ecma376.v2008.transitional.shared.additionalCharacteristics`` ``http://schemas.openxmlformats.org/officeDocument/2006/characteristics`` ``pyxb.bundles.ecma376.v2008.transitional.shared.bibliography`` ``http://schemas.openxmlformats.org/officeDocument/2006/bibliography`` ``pyxb.bundles.ecma376.v2008.transitional.shared.commonSimpleTypes`` ``http://schemas.openxmlformats.org/officeDocument/2006/sharedTypes`` ``pyxb.bundles.ecma376.v2008.transitional.shared.customXmlDataProperties`` ``http://schemas.openxmlformats.org/officeDocument/2006/customXml`` ``pyxb.bundles.ecma376.v2008.transitional.shared.customXmlSchemaProperties`` ``http://schemas.openxmlformats.org/schemaLibrary/2006/main`` ``pyxb.bundles.ecma376.v2008.transitional.shared.documentPropertiesCustom`` ``http://schemas.openxmlformats.org/officeDocument/2006/custom-properties`` ``pyxb.bundles.ecma376.v2008.transitional.shared.documentPropertiesExtended`` ``http://schemas.openxmlformats.org/officeDocument/2006/extended-properties`` ``pyxb.bundles.ecma376.v2008.transitional.shared.documentPropertiesVariantTypes`` ``http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes`` ``pyxb.bundles.ecma376.v2008.transitional.shared.math`` ``http://schemas.openxmlformats.org/officeDocument/2006/math`` ``pyxb.bundles.ecma376.v2008.transitional.shared.relationshipReference`` ``http://schemas.openxmlformats.org/officeDocument/2006/relationships`` ``pyxb.bundles.ecma376.v2008.transitional.sml`` ``http://schemas.openxmlformats.org/spreadsheetml/2006/main`` ``pyxb.bundles.ecma376.v2008.transitional.vml.main`` ``urn:schemas-microsoft-com:vml`` ``pyxb.bundles.ecma376.v2008.transitional.vml.officeDrawing`` ``urn:schemas-microsoft-com:office:office`` ``pyxb.bundles.ecma376.v2008.transitional.vml.presentationDrawing`` ``urn:schemas-microsoft-com:office:powerpoint`` ``pyxb.bundles.ecma376.v2008.transitional.vml.spreadsheetDrawing`` ``urn:schemas-microsoft-com:office:excel`` ``pyxb.bundles.ecma376.v2008.transitional.vml.wordprocessingDrawing`` ``urn:schemas-microsoft-com:office:word`` ``pyxb.bundles.ecma376.v2008.transitional.wml`` ``http://schemas.openxmlformats.org/wordprocessingml/2006/main`` ================================================================================= ========================================================== .. _bundle_opengis: OpenGIS ------- .. note:: As of PyXB 1.2.0, this bundle supports the version of the OGC Schema that use the W3C XLink 1.1 instead of the older OGC XLink schema. See http://www.opengeospatial.org/blog/1597 for more information about this change. The following namespaces are available in support of `Open Geospatial Consortium `_ Geographic Information System processing. Note that several of these namespaces are "private" bindings generated because the OGC definitions include their own schema for use local to another schema. The modules corresponding to these namespace uses begin with an underscore, and should generally not be used in other contexts. This bundle is not populated in the distributed versions of PyXB because it requires some 168MB of space to hold the schemas, generated bindings, and archive files. To build it, set ``PYXB_ROOT`` environment variable to the absolute path of the unpacked PyXB distribution (the directory containing :file:`setup.py`) and run these commands:: cd ${PYXB_ROOT} pyxb/bundles/opengis/scripts/genbind python setup.py install This will download the schemas from OGC, generate bindings for the namespaces below, and (re-)install PyXB including the new bindings. Other namespaces are available and can be added by modifying the ``genbind`` script and re-running the commands above. .. PYXB_ARCHIVE_PATH=${PYXB_ROOT}/pyxb/bundles/opengis// ${PYXB_ROOT}/scripts/pyxbdump \ | awk '$2~/pyxb.bundles.opengis/ { print $2, $1; }' \ | sed \ -e 's@^@``@' \ -e 's@ @``\t``@' \ -e 's@$@``@' \ | expand -50 \ | sort \ > /tmp/x ================================================ ========================================================== Binding Module Namespace ================================================ ========================================================== ``pyxb.bundles.opengis._ogc`` ``http://www.opengis.net/ogc`` ``pyxb.bundles.opengis._sam`` ``http://www.opengis.net/sampling/2.0`` ``pyxb.bundles.opengis._sams`` ``http://www.opengis.net/samplingSpatial/2.0`` ``pyxb.bundles.opengis.atom`` ``http://www.w3.org/2005/Atom`` ``pyxb.bundles.opengis.citygml.appearance`` ``http://www.opengis.net/citygml/appearance/1.0`` ``pyxb.bundles.opengis.citygml.base`` ``http://www.opengis.net/citygml/1.0`` ``pyxb.bundles.opengis.citygml.building`` ``http://www.opengis.net/citygml/building/1.0`` ``pyxb.bundles.opengis.citygml.cityFurniture`` ``http://www.opengis.net/citygml/cityfurniture/1.0`` ``pyxb.bundles.opengis.citygml.cityObjectGroup`` ``http://www.opengis.net/citygml/cityobjectgroup/1.0`` ``pyxb.bundles.opengis.citygml.generics`` ``http://www.opengis.net/citygml/generics/1.0`` ``pyxb.bundles.opengis.citygml.landUse`` ``http://www.opengis.net/citygml/landuse/1.0`` ``pyxb.bundles.opengis.citygml.relief`` ``http://www.opengis.net/citygml/relief/1.0`` ``pyxb.bundles.opengis.citygml.texturedSurface`` ``http://www.opengis.net/citygml/texturedsurface/1.0`` ``pyxb.bundles.opengis.citygml.transportation`` ``http://www.opengis.net/citygml/transportation/1.0`` ``pyxb.bundles.opengis.citygml.vegetation`` ``http://www.opengis.net/citygml/vegetation/1.0`` ``pyxb.bundles.opengis.citygml.waterBody`` ``http://www.opengis.net/citygml/waterbody/1.0`` ``pyxb.bundles.opengis.csw_2_0_2`` ``http://www.opengis.net/cat/csw/2.0.2`` ``pyxb.bundles.opengis.csw_dc`` ``http://purl.org/dc/elements/1.1/`` ``pyxb.bundles.opengis.csw_dct`` ``http://purl.org/dc/terms/`` ``pyxb.bundles.opengis.fes_2_0`` ``http://www.opengis.net/fes/2.0`` ``pyxb.bundles.opengis.filter`` ``http://www.opengis.net/ogc`` ``pyxb.bundles.opengis.gml_3_2`` ``http://www.opengis.net/gml/3.2`` ``pyxb.bundles.opengis.gml_3_3.ce`` ``http://www.opengis.net/gml/3.3/ce`` ``pyxb.bundles.opengis.gml_3_3.exr`` ``http://www.opengis.net/gml/3.3/exr`` ``pyxb.bundles.opengis.gml_3_3.lr`` ``http://www.opengis.net/gml/3.3/lr`` ``pyxb.bundles.opengis.gml_3_3.lro`` ``http://www.opengis.net/gml/3.3/lro`` ``pyxb.bundles.opengis.gml_3_3.lrov`` ``http://www.opengis.net/gml/3.3/lrov`` ``pyxb.bundles.opengis.gml_3_3.lrtr`` ``http://www.opengis.net/gml/3.3/lrtr`` ``pyxb.bundles.opengis.gml_3_3.rgrid`` ``http://www.opengis.net/gml/3.3/rgrid`` ``pyxb.bundles.opengis.gml_3_3.tin`` ``http://www.opengis.net/gml/3.3/tin`` ``pyxb.bundles.opengis.gml_3_3.xbt`` ``http://www.opengis.net/gml/3.3/xbt`` ``pyxb.bundles.opengis.gml`` ``http://www.opengis.net/gml`` ``pyxb.bundles.opengis.gmlsf`` ``http://www.opengis.net/gmlsf`` ``pyxb.bundles.opengis.ic_ism_2_1`` ``urn:us:gov:ic:ism:v2`` ``pyxb.bundles.opengis.iso19139.v20070417.gco`` ``http://www.isotc211.org/2005/gco`` ``pyxb.bundles.opengis.iso19139.v20070417.gmd`` ``http://www.isotc211.org/2005/gmd`` ``pyxb.bundles.opengis.iso19139.v20070417.gmx`` ``http://www.isotc211.org/2005/gmx`` ``pyxb.bundles.opengis.iso19139.v20070417.gsr`` ``http://www.isotc211.org/2005/gsr`` ``pyxb.bundles.opengis.iso19139.v20070417.gss`` ``http://www.isotc211.org/2005/gss`` ``pyxb.bundles.opengis.iso19139.v20070417.gts`` ``http://www.isotc211.org/2005/gts`` ``pyxb.bundles.opengis.misc.xAL`` ``urn:oasis:names:tc:ciq:xsdschema:xAL:2.0`` ``pyxb.bundles.opengis.ogckml22`` ``http://www.opengis.net/kml/2.2`` ``pyxb.bundles.opengis.om_1_0`` ``http://www.opengis.net/om/1.0`` ``pyxb.bundles.opengis.om_2_0`` ``http://www.opengis.net/om/2.0`` ``pyxb.bundles.opengis.oseo_1_0`` ``http://www.opengis.net/oseo/1.0`` ``pyxb.bundles.opengis.ows_1_1`` ``http://www.opengis.net/ows/1.1`` ``pyxb.bundles.opengis.ows_2_0`` ``http://www.opengis.net/ows/2.0`` ``pyxb.bundles.opengis.ows`` ``http://www.opengis.net/ows`` ``pyxb.bundles.opengis.sampling_1_0`` ``http://www.opengis.net/sampling/1.0`` ``pyxb.bundles.opengis.sensorML_1_0_1`` ``http://www.opengis.net/sensorML/1.0.1`` ``pyxb.bundles.opengis.smil20`` ``http://www.w3.org/2001/SMIL20/`` ``pyxb.bundles.opengis.smil20lang`` ``http://www.w3.org/2001/SMIL20/Language`` ``pyxb.bundles.opengis.sos_1_0`` ``http://www.opengis.net/sos/1.0`` ``pyxb.bundles.opengis.sos_2_0`` ``http://www.opengis.net/sos/2.0`` ``pyxb.bundles.opengis.swe_1_0_0`` ``http://www.opengis.net/swe/1.0`` ``pyxb.bundles.opengis.swe_1_0_1`` ``http://www.opengis.net/swe/1.0.1`` ``pyxb.bundles.opengis.swe_2_0`` ``http://www.opengis.net/swe/2.0`` ``pyxb.bundles.opengis.swes_2_0`` ``http://www.opengis.net/swes/2.0`` ``pyxb.bundles.opengis.tml`` ``http://www.opengis.net/tml`` ``pyxb.bundles.opengis.waterml`` ``http://www.opengis.net/waterml/2.0`` ``pyxb.bundles.opengis.wcs_1_1`` ``http://www.opengis.net/wcs/1.1`` ``pyxb.bundles.opengis.wfs`` ``http://www.opengis.net/wfs`` ``pyxb.bundles.opengis.wps_1_0_0`` ``http://www.opengis.net/wps/1.0.0`` ================================================ ========================================================== .. _bundle_layout: Layout of a Bundle Directory ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ The ``pyxb/bundles`` directory contains groups of bindings for related schema. These groups are called "bundles", and each subdirectory represents a particular bundle. With a bundle directory, the following are expected: - A ``scripts`` directory, containing an executable ``genbind`` which retrieves the schema and invokes ``pyxbgen`` to build the bindings - A ``schemas`` directory, into which the ``genbind`` script stores the schemas that were used to build the bindings - The Python module files for namespace modules. Normally these are :ref:`customization wrappers ` - A ``raw`` subdirectory, into which the generated bindings are placed. This directory is normally removed and recreated as a consequence of running genbind; don't expect anything in it to be persistent. - An ``examples`` directory, with programs that show how to use the capabilities in the bundle - A ``tests`` directory which validates customizations Generating Bundled Bindings ^^^^^^^^^^^^^^^^^^^^^^^^^^^ To create the support infrastructure for a particular bundle, set the ``PYXB_ROOT`` environment variable to the root of an unpacked PyXB distribution and run the ``scripts/genbind`` script in the bundle root. For example:: cd ${PYXB_ROOT} pyxb/bundles/wssplat/scripts/genbind will invoke the :manpage:`wget(1)` program to retrieve the XML schema for a variety of namespaces related to web services and then generate bindings and archive files for them. Generating bundles should be a one-time action for each release of PyXB. .. note:: Some servers, including http://www.w3.org, enforce an artificial delay in retrieving schema documents in order to encourage systems to use cached local copies. The :file:`genbind` infrastructure will cache the schemas it downloads, but running the generation scripts for the `common`_ bundle, and possibly others, may result in errors if the caches are removed and the scripts run too frequently. PyXB-1.2.6/doc/html/_sources/arch_content.txt0000644000175000017500000002277713152762205020455 0ustar pabpab00000000000000.. _contentModel: Content Model ============= PyXB's content model is used to complete the link between the :ref:`componentModel` and the :ref:`bindingModel`. These classes are the ones that: - determine what Python class attribute is used to store which XML element or attribute; - distinguish those elements that can occur at most once from those that require an aggregation; and - ensure that the ordering and occurrence constraints imposed by the XML `model group `_ are satisfied, when XML is converted to Python instances and vice-versa. Associating XML and Python Objects ---------------------------------- Most of the classes involved in the content model are in the :py:obj:`pyxb.binding.content` module. The relations among these classes are displayed in the following diagram. .. _cd_contentModel: .. image:: Images/ContentModel.jpg In the standard code generation template, both element and attribute values are stored in Python class fields. As noted in :ref:`binding_deconflictingNames` it is necessary to ensure an attribute and an element which have the same name in their containing complex type have distinct names in the Python class corresponding to that type. Use information for each of these is maintained in the type class. This use information comprises: - the original :py:obj:`name ` of the element/attribute in the XML - its :py:obj:`deconflicted name ` in Python - the private name by which the value is stored in the Python instance dictionary Other information is specific to the type of use. The :py:obj:`pyxb.binding.basis.complexTypeDefinition` retains maps from the component's name the attribute use or element use instance corresponding to the component's use. .. _attributeUse: Attribute Uses ^^^^^^^^^^^^^^ The information associated with an `attribute use `_ is recorded in an :py:obj:`pyxb.binding.content.AttributeUse` instance. This class provides: - The :py:obj:`name ` of the attribute - The :py:obj:`default value ` of the attribute - Whether the attribute value is :py:obj:`fixed ` - Whether the `attribute use `_ is :py:obj:`required ` or :py:obj:`prohibited ` - The :py:obj:`type ` of the attribute, as a subclass of :py:obj:`pyxb.binding.basis.simpleTypeDefinition` - Methods to :py:obj:`read `, :py:obj:`set `, and :py:obj:`reset ` the value of the attribute in a given binding instance. A :py:obj:`map ` is used to map from expanded names to AttributeUse instances. This map is defined within the class definition itself. .. _elementUse: Element Uses ^^^^^^^^^^^^ The element analog to an attribute use is an `element declaration `_, and the corresponding information is stored in a :py:obj:`pyxb.binding.content.ElementDeclaration` instance. This class provides: - The :py:obj:`element binding ` that defines the properties of the referenced element, including its type - Whether the use allows :py:obj:`multiple occurrences ` - The :py:obj:`default value ` of the element. Currently this is either C{None} or an empty list, depending on :py:obj:`pyxb.binding.content.ElementDeclaration.isPlural` - Methods to :py:obj:`read `, :py:obj:`set `, :py:obj:`append to ` (only for plural elements), and :py:obj:`reset ` the value of the element in a given binding instance - The :py:obj:`setOrAppend ` method, which is most commonly used to provide new content to a value A :py:obj:`map ` is used to map from expanded names to ElementDeclaration instances. This map is defined within the class definition itself. As mentioned before, when the same element name appears at multiple places within the element content the uses are collapsed into a single attribute on the complex type; thus the map is to the :py:obj:`ElementDeclaration `, not the :py:obj:`ElementUse `. .. _validating-content: Validating the Content Model ---------------------------- As of :ref:`PyXB 1.2.0 `, content validation is performed using the **Finite Automata with Counters (FAC)** data structure, as described in `Regular Expressions with Numerical Constraints and Automata with Counters `_, `Dag Hovland `_, Lecture Notes in Computer Science, 2009, Volume 5684, Theoretical Aspects of Computing - ICTAC 2009, Pages 231-245. This structure allows accurate validation of occurrence and order constraints without the complexity of the original back-tracking validation solution from :ref:`PyXB 1.1.1 ` and earlier. It also avoids the :ticket:`incorrect rejection of valid documents <112>` that (rarely) occurred with the greedy algorithm introduced in :ref:`PyXB 1.1.2 `. Conversion to this data structure also enabled the distinction between :py:obj:`element declaration ` and :py:obj:`element use ` nodes, allowing diagnostics to trace back to the element references in context. The data structures for the automaton and the configuration structure that represents a processing automaton are: .. image:: Images/FACAutomaton.jpg The implementation in PyXB is generally follows the description in the ICTAC 2009 paper. Calculation of first/follow sets has been enhanced to support term trees with more than two children per node. In addition, support for unordered catenation as required for the `"all" model group `_ is implemented by a state that maintains a distinct sub-automaton for each alternative, requiring a layered approach where executon of an automaton is suspended until the subordinate automaton has accepted and a transition out of it is encountered. For more information on the implementation, please see the :py:obj:`FAC module `. This module has been written to be independent of PyXB infrastructure, and may be re-used in other code in accordance with the :ref:`PyXB license `. FAC and the PyXB Content Model ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ As depicted in the :ref:`Content Model class diagram ` each complex type binding class has a :py:obj:`_Automaton ` which encodes the content model of the type as a Finite Automaton with Counters. This representation models the occurrence constraints and sub-element orders, referencing the specific element and wildcard uses as they appear in the schema. Each instance of a complex binding supports an :py:obj:`AutomatonConfiguration ` that is used to validate the binding content against the model. An :py:obj:`ElementUse ` instance is provided as the metadata for automaton states that correspond an element declaration in the schema. Similarly, a :py:obj:`WildcardUse ` instance is used as the metadata for automaton states that correspond to an instance of the `xs:any `_ wildcard schema component. Validation in the automaton delegates through the :py:obj:`SymbolMatch_mixin ` interface to see whether content in the form of a complex type binding instance is conformant to the restrictions on symbols associated with a particular state. When parsing, a transition taken results in the storage of the consumed symbol into the appropriate element attribute or wildcard list in the binding instance. In many cases, the transition from one state to a next is uniquely determined by the content; as long as this condition holds, the :py:obj:`AutomatonConfiguration ` instance retains a single underlying :py:obj:`FAC Configuration ` representing the current state. To generate the XML corresponding to a binding instance, the element and wildcard content of the instance are loaded into a Python dictionary, keyed by the :py:obj:`ElementDeclaration `. These subordinate elements are appended to a list of child nodes as transitions that recognize them are encountered. As of :ref:`PyXB 1.2.0 ` the first legal transition in the order imposed by the schema is taken, and there is no provision for influencing the order in the generated document when multiple orderings are valid. .. ignored ## Local Variables: ## fill-column:78 ## indent-tabs-mode:nil ## End: PyXB-1.2.6/doc/html/_sources/index.txt0000644000175000017500000001063713152762205017105 0ustar pabpab00000000000000.. PyXB documentation master file .. Sphinx standard indentations # with overline, for parts * with overline, for chapters =, for sections -, for subsections ^, for subsubsections ", for paragraphs .. role:: namespace(literal) ################################ PyXB: Python XML Schema Bindings ################################ PyXB ("pixbee") is a pure `Python `_ package that generates Python source code for classes that correspond to data structures defined by `XMLSchema `_. The generated classes support bi-directional conversion between `XML `_ documents and Python objects. In concept it is similar to `JAXB `_ for Java and `CodeSynthesis XSD `_ for C++. A :ref:`thirty_sec_example` is at the bottom of this page. Step-by-step examples are in :ref:`userReference`. ************ Getting Help ************ PyXB is distributed on `SourceForge `_ and `PyPI `_, but active development has moved to `Github `_. Inter-release updates will be available on github on the `next `_ branch of the PyXB repository. For support, consult the `Help Forum `_, or subscribe to and email the `mailing list `_. To file a bug report or see the status of defects reported against the current release, visit the `Github issues page `_. (Older defects were archived under Trac at SourceForge; the historical data was moved to the `SF ticket interface `_ when SourceForge stopped supporting hosted applications. Do not attempt to open new issues on SourceForge.) For a history of releases, see :ref:`releases`. ******** Contents ******** .. toctree:: :maxdepth: 2 overview examples releases architecture userref_index pyxb maintref .. _thirty_sec_example: ********************* Thirty Second Example ********************* An example of a program using PyXB to interact with a `web service `_ [*]_ using an automatically-generated module. First, retrieve the WSDL and generate the bindings:: llc[566]$ pyxbgen \ --wsdl-location=http://wsf.cdyne.com/WeatherWS/Weather.asmx?WSDL \ --module=weather \ --write-for-customization Retrieving WSDL from http://wsf.cdyne.com/WeatherWS/Weather.asmx?WSDL WARNING:pyxb.binding.basis:Unable to convert DOM node {http://www.w3.org/2001/XMLSchema}schema at Weather.asmx?WSDL[4:4] to binding PS urn:uuid:8292a36c-577f-11e4-b592-c8600024e903 WARNING:pyxb.binding.generate:Complex type {http://ws.cdyne.com/WeatherWS/}ArrayOfWeatherDescription renamed to ArrayOfWeatherDescription_ WARNING:pyxb.binding.generate:Complex type {http://ws.cdyne.com/WeatherWS/}ForecastReturn renamed to ForecastReturn_ WARNING:pyxb.binding.generate:Complex type {http://ws.cdyne.com/WeatherWS/}WeatherReturn renamed to WeatherReturn_ Python for http://ws.cdyne.com/WeatherWS/ requires 1 modules Then write a program that uses them: .. literalinclude:: ../examples/weather/client_get.py And run it:: llc[567]$ python client_get.py Weather forecast for Saint Paul, MN: Wednesday, August 13 2014: Partly Cloudy, from 63 to 83 Thursday, August 14 2014: Partly Cloudy, from 61 to 82 Friday, August 15 2014: Partly Cloudy, from 65 to 86 Saturday, August 16 2014: Partly Cloudy, from 67 to 84 Sunday, August 17 2014: Partly Cloudy, from 67 to 82 Monday, August 18 2014: Partly Cloudy, from 67 to 83 Tuesday, August 19 2014: Partly Cloudy, from 65 to 84 That's it. .. [*] **Note**: Sometime between 2014 and 2017 the CDYNE Weather Service disappeared, although as of 2017-05-13 the link to its description above was still present. If you care about weather, there is a more complex example interfacing with the `National Digital Forecast Database `_ in the ``examples/ndfd`` directory. ****************** Indices and tables ****************** * :ref:`genindex` * :ref:`search` .. ignored ## Local Variables: ## fill-column:78 ## indent-tabs-mode:nil ## End: PyXB-1.2.6/doc/html/_sources/overview_what.txt0000644000175000017500000000256413152762205020667 0ustar pabpab00000000000000What Is PyXB? ============= PyXB is a pure `Python `_ package that generates Python code for classes that correspond to data structures defined by `XMLSchema `_. In concept it is similar to `JAXB `_ for Java and `CodeSynthesis XSD `_ for C++. The major goals of PyXB are: * Provide a generated Python interface that is "Pythonic", meaning similar to one that would have been hand-written: + Attributes and elements are Python properties, with name conflicts resolved in favor of elements + Elements with maxOccurs larger than 1 are stored as Python lists + Bindings for type extensions inherit from the binding for the base type + Enumeration constraints are exposed as class (constant) variables * Support bi-directional conversion (document to Python and back) * Allow easy customization of the generated bindings to provide functionality along with content * Support all XMLSchema features that are in common use, including: + complex content models (nested all/choice/sequence) + cross-namespace dependencies + include and import directives + constraints on simple types * Validate the documents against their schema Secondary goals, some of which have been achieved in the current release, are listed in :ref:`pyxb_vision`. PyXB-1.2.6/doc/html/_sources/userref_index.txt0000644000175000017500000000025313152762205020631 0ustar pabpab00000000000000.. _userReference: ************** User Reference ************** .. toctree:: :maxdepth: 2 userref_pyxbgen userref_usebind userref_validating pyxbgen_cli PyXB-1.2.6/doc/html/_sources/pyxbgen_cli.txt0000644000175000017500000004326413152762205020303 0ustar pabpab00000000000000.. _pyxbgen-cli: ``pyxbgen`` Command Line Options ================================ Generic Options --------------- .. table:: Generic Options ============= ========= ====== ================================================== Long Option Argument Alt Description ============= ========= ====== ================================================== ``--version`` :ref:`show program's version number and exit` ``--help`` ``-h`` :ref:`show this help message and exit` ============= ========= ====== ================================================== .. _pyxbgen--version: ``--version`` ^^^^^^^^^^^^^ show program's version number and exit .. _pyxbgen--help: ``--help`` ^^^^^^^^^^ show this help message and exit Identifying Schema ------------------ Specify and locate schema for which bindings should be generated. .. table:: Identifying Schema =================================== ============= ====== ================================================== Long Option Argument Alt Description =================================== ============= ====== ================================================== ``--schema-location`` *FILE_or_URL* ``-u`` :ref:`Add the location of an entrypoint schema. The...` ``--schema-root`` *DIRECTORY* :ref:`The directory from which entrypoint schemas...` ``--schema-stripped-prefix`` *TEXT* :ref:`Optional string that is stripped from the...` ``--location-prefix-rewrite`` *TEXT* :ref:`Add a rewrite entry for schema locations....` ``--uri-content-archive-directory`` *DIRECTORY* :ref:`The directory path into which any content...` =================================== ============= ====== ================================================== .. _pyxbgen--schema-location: ``--schema-location`` ^^^^^^^^^^^^^^^^^^^^^ Add the location of an entrypoint schema. The provided value should be a URL; if it does not have a URL scheme (e.g., ``http:``), it is assumed to be a file, and if it is not an absolute path is located relative to the ``schemaRoot``. .. _pyxbgen--schema-root: ``--schema-root`` ^^^^^^^^^^^^^^^^^ The directory from which entrypoint schemas specified as relative file paths will be read. .. _pyxbgen--schema-stripped-prefix: ``--schema-stripped-prefix`` ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Optional string that is stripped from the beginning of schemaLocation values before loading from them. This now applies only to URIs specified on the command line so is unlikely to be useful. .. _pyxbgen--location-prefix-rewrite: ``--location-prefix-rewrite`` ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Add a rewrite entry for schema locations. Parameter values are strings of the form ``pfx=sub``. The effect is that a schema location that begins with ``pfx`` is rewritten so that it instead begins with ``sub``. This applies to schemaLocation attributes in ``import`` and ``include`` elements. It may be used to convert absolute schema locations into relative ones to allow offline processing when all schema are available in a local directory. See ``schemaRoot``. .. _pyxbgen--uri-content-archive-directory: ``--uri-content-archive-directory`` ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ The directory path into which any content retrieved by URI will be written. This serves as a local cache, and to give you an opportunity to inspect material retrieved from some other system. @rtype: ``str`` Configuring Bindings -------------------- Specify where generated bindings should be written, and how they will be accessed from Python. .. table:: Configuring Bindings ================================ =========== ====== ================================================== Long Option Argument Alt Description ================================ =========== ====== ================================================== ``--module`` *MODULE* ``-m`` :ref:`Add a module name corresponding to an entrypoint...` ``--module-prefix`` *MODULE* :ref:`The prefix for binding modules. The base name for...` ``--binding-root`` *DIRECTORY* :ref:`The directory path into which generated bindings...` ``--write-for-customization`` ``-r`` :ref:`Indicates whether the binding Python code should...` ``--no-write-for-customization`` :ref:`Indicates whether the binding Python code should...` ================================ =========== ====== ================================================== .. _pyxbgen--module: ``--module`` ^^^^^^^^^^^^ Add a module name corresponding to an entrypoint schema. The namespace defined by the corresponding schema will be written to a binding using the given module name, adjusted by L{modulePrefix}. .. _pyxbgen--module-prefix: ``--module-prefix`` ^^^^^^^^^^^^^^^^^^^ The prefix for binding modules. The base name for the module holding a binding is taken from the moduleList, moduleMap, or an XMLNS prefix associated with the namespace in a containing schema. This value, if present, is used as a prefix to allow a deeper module hierarchy. .. _pyxbgen--binding-root: ``--binding-root`` ^^^^^^^^^^^^^^^^^^ The directory path into which generated bindings will be written. @rtype: ``str`` .. _pyxbgen--write-for-customization: ``--write-for-customization`` ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Indicates whether the binding Python code should be written into a sub- module for customization. If enabled, a module ``path.to.namespace`` will be written to the file ``path/to/raw/namespace.py``, so that the file ``path/to/namespace.py`` can import it and override behavior. This option turns on the feature. .. _pyxbgen--no-write-for-customization: ``--no-write-for-customization`` ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Indicates whether the binding Python code should be written into a sub- module for customization. If enabled, a module ``path.to.namespace`` will be written to the file ``path/to/raw/namespace.py``, so that the file ``path/to/namespace.py`` can import it and override behavior. This option turns off the feature (*default*). Reading Namespace Archives -------------------------- Locating and loading (or inhibiting load of) namespace archives. .. table:: Reading Namespace Archives ================================== ========= ==== ================================================== Long Option Argument Alt Description ================================== ========= ==== ================================================== ``--archive-path`` *PATH* :ref:`A colon-separated list of paths from which...` ``--import-augmentable-namespace`` *URI* :ref:`Mark that the specified namespace may be imported...` ``--no-load-namespace`` *URI* :ref:`Mark that the specified namespace should not be...` ================================== ========= ==== ================================================== .. _pyxbgen--archive-path: ``--archive-path`` ^^^^^^^^^^^^^^^^^^ A colon-separated list of paths from which namespace archives can be read. The default path is the contents of the ``PYXB_ARCHIVE_PATH`` environment variable, or the standard path configured at installation time. Any file with the extension ``.wxs`` found in one of these directories is examined to see whether it is a namespace archive. .. _pyxbgen--import-augmentable-namespace: ``--import-augmentable-namespace`` ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Mark that the specified namespace may be imported by new bindings. Normally namespaces that are available from archives are considered to be complete, and schema locations in import directives are ignored. Use this to indicate that the bindings being generated import new bindings. Note that attempts to import schema that contributed to the archive will only be detected if the archive was generated from the same schemaLocation URI; if the archive was generated from a different source component definitions might conflict. .. _pyxbgen--no-load-namespace: ``--no-load-namespace`` ^^^^^^^^^^^^^^^^^^^^^^^ Mark that the specified namespace should not be loaded from an archive. Use this when you are generating bindings for an application that has a restricted profile of a namespace that would otherwise be read from an archive. Be aware that this removes any knowledge of any archive in which this namespace is present as a non-private member. Writing Namespace Archives -------------------------- Control the location and content of a namespace archive corresponding to a binding generation. .. table:: Writing Namespace Archives =============================== ========= ==== ================================================== Long Option Argument Alt Description =============================== ========= ==== ================================================== ``--archive-to-file`` *FILE* :ref:`Optional file into which the archive of namespaces...` ``--public-namespace`` *URI* :ref:`Indicates, for specific namespaces, whether their...` ``--private-namespace`` *URI* :ref:`Indicates, for specific namespaces, whether their...` ``--default-namespace-public`` :ref:`Indicates whether unmentioned namespaces will be...` ``--default-namespace-private`` :ref:`Indicates whether unmentioned namespaces will be...` =============================== ========= ==== ================================================== .. _pyxbgen--archive-to-file: ``--archive-to-file`` ^^^^^^^^^^^^^^^^^^^^^ Optional file into which the archive of namespaces will be written. Subsequent generation actions can read pre-parsed namespaces from this file, and therefore reference the bindings that were built earlier rather than re-generating them. The file name should normally end with ``.wxs``. .. _pyxbgen--public-namespace: ``--public-namespace`` ^^^^^^^^^^^^^^^^^^^^^^ Indicates, for specific namespaces, whether their visibility in the archive should be public or private. This option adds the namespace as a public archive member. .. _pyxbgen--private-namespace: ``--private-namespace`` ^^^^^^^^^^^^^^^^^^^^^^^ Indicates, for specific namespaces, whether their visibility in the archive should be public or private. This option adds the namespace as a private archive member. .. _pyxbgen--default-namespace-public: ``--default-namespace-public`` ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Indicates whether unmentioned namespaces will be public or private (default) in the archive. A namespace is *mentioned* if it is the target namespace of an entrypoint schema, or appears in a namespace visibility specification. I.e., this default applies only to namespaces that are modified as a result of including some schema, which is generally a local customization of something. This option makes the default ``public`` (*default*). .. _pyxbgen--default-namespace-private: ``--default-namespace-private`` ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Indicates whether unmentioned namespaces will be public or private (default) in the archive. A namespace is *mentioned* if it is the target namespace of an entrypoint schema, or appears in a namespace visibility specification. I.e., this default applies only to namespaces that are modified as a result of including some schema, which is generally a local customization of something. This option makes the default ``private``. Configuring Binding Code Generation ----------------------------------- Control the style and content of the generated bindings. This is not well-supported, and you are advised to pretend these options don't exist. .. table:: Configuring Binding Code Generation ========================= ========= ==== ================================================== Long Option Argument Alt Description ========================= ========= ==== ================================================== ``--validate-changes`` :ref:`Indicates whether the bindings should validate...` ``--no-validate-changes`` :ref:`Indicates whether the bindings should validate...` ========================= ========= ==== ================================================== .. _pyxbgen--validate-changes: ``--validate-changes`` ^^^^^^^^^^^^^^^^^^^^^^ Indicates whether the bindings should validate mutations against the content model. This option turns on validation (default). .. _pyxbgen--no-validate-changes: ``--no-validate-changes`` ^^^^^^^^^^^^^^^^^^^^^^^^^ Indicates whether the bindings should validate mutations against the content model. This option turns off validation. Miscellaneous Options --------------------- Anything else. .. table:: Miscellaneous Options ========================= ========= ==== ================================================== Long Option Argument Alt Description ========================= ========= ==== ================================================== ``--logging-config-file`` *FILE* :ref:`A file provided to L{logging.config.fileConfig} to...` ========================= ========= ==== ================================================== .. _pyxbgen--logging-config-file: ``--logging-config-file`` ^^^^^^^^^^^^^^^^^^^^^^^^^ A file provided to L{logging.config.fileConfig} to control log messages. In the absence of other configuration the Python standard logging infrastructure is used in its default configuration. @rtype: ``str`` Maintainer Options ------------------ Don't use these. They don't exist. If they did, they'd do different things at different times, and if you used them you'd probably be sorry. .. table:: Maintainer Options ================================= ========= ==== ================================================== Long Option Argument Alt Description ================================= ========= ==== ================================================== ``--allow-absent-module`` :ref:`Indicates whether the code generator is permitted...` ``--no-allow-absent-module`` :ref:`Indicates whether the code generator is permitted...` ``--allow-builtin-generation`` :ref:`Indicates whether bindings will be written for...` ``--no-allow-builtin-generation`` :ref:`Indicates whether bindings will be written for...` ================================= ========= ==== ================================================== .. _pyxbgen--allow-absent-module: ``--allow-absent-module`` ^^^^^^^^^^^^^^^^^^^^^^^^^ Indicates whether the code generator is permitted to process namespace for which no module path can be determined. Use this only when generating bindings that will not be referenced by other bindings. This option turns on the feature. .. _pyxbgen--no-allow-absent-module: ``--no-allow-absent-module`` ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Indicates whether the code generator is permitted to process namespace for which no module path can be determined. Use this only when generating bindings that will not be referenced by other bindings. This option turns off the feature (default). .. _pyxbgen--allow-builtin-generation: ``--allow-builtin-generation`` ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Indicates whether bindings will be written for namespaces that are built-in to PyXB. This must be enabled when building bindings for the XML, XMLSchema instance, and other built-in namespaces. Normally generation of these namespaces is inhibited lest it produce inconsistencies. This option turns on the feature. .. _pyxbgen--no-allow-builtin-generation: ``--no-allow-builtin-generation`` ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Indicates whether bindings will be written for namespaces that are built-in to PyXB. This must be enabled when building bindings for the XML, XMLSchema instance, and other built-in namespaces. Normally generation of these namespaces is inhibited lest it produce inconsistencies. This option turns off the feature (default). WSDL Options ------------ Options relevant to generating bindings from WSDL service descriptions .. table:: WSDL Options =================== ============= ====== ================================================== Long Option Argument Alt Description =================== ============= ====== ================================================== ``--wsdl-location`` *FILE_or_URL* ``-W`` :ref:`Generate bindings for the types stanza of the...` =================== ============= ====== ================================================== .. _pyxbgen--wsdl-location: ``--wsdl-location`` ^^^^^^^^^^^^^^^^^^^ Generate bindings for the ``types`` stanza of the WSDL at this location. This option is equivalent to retrieving the WSDL, extracting the schema part of its ``types`` block to a file, and using that file as a ``--schema-location``. PyXB-1.2.6/doc/html/_sources/examples.txt0000644000175000017500000001260213152762205017606 0ustar pabpab00000000000000.. _examples: ******** Examples ******** A detailed, albeit contrived, example of how to use PyXB is in :ref:`pyxbgen`. Multiple real-world XML and web service examples of varying complexity are provided in the :file:`examples` subdirectories of the PyXB distribution and of the various bundles. Some are WSDL services, and others are simply XMLSchema documents. Often there are a couple trivial programs that show how the bindings are used. The script :file:`test.sh` in each directory can be used to generate the bindings and run the programs in a single step. See the :file:`README.txt` file in each example subdirectory for more information. For ... - REST-style interactions, see :ref:`ex_dictionary`, :ref:`ex_ndfd`, and :ref:`thirty_sec_example` - SOAP interactions, see :ref:`ex_weather`, :ref:`ex_ndfd`, and :ref:`ex_geocoder` - Customizing a generated binding, see :ref:`ex_tmsxtvd` - Using a SAX parser, see :ref:`ex_tmsxtvd` You may also want to look at some of the unit tests for other ideas. .. _ex_dictionary: Dictionary (Aonaware) ===================== The `Dictionary web service at Aonaware `_. The example :file:`define.py` looks up a word in all available dictionaries: .. literalinclude:: ../examples/dictionary/define.py The example :file:`showdict.py` lists the available dictionaries: .. literalinclude:: ../examples/dictionary/showdict.py Sorry, no automatic generation of classes corresponding to the WSDL operations. Next release, maybe. .. _ex_weather: Simple Weather (CDyne) ====================== A `free weather service `_. The REST interface was demonstrated as the :ref:`thirty_sec_example`. A SOAP interface example is in ``client.py``: .. literalinclude:: ../examples/weather/client.py Note the various misspellings in the schema (e.g., "Desciption"). Also, be aware that the weather information in this service does not get updated often, and sometimes fails to provide valid dates. Try various zip codes; usually you can find one that works. .. _ex_ndfd: Professional Weather (National Digital Forecast Data) ===================================================== Interact with the `National Digital Forecast Database `_. Use the :file:`genbindings.sh` script to retrieve the schema for Digital Weather Markup Language and generate the bindings. Note that the schema has two levels of ``include`` directives, which PyXB follows. The examples for this service are too long to include into the web documentation. :file:`forecast.py` uses the REST interface to get the forecast temperature data for two locations, and print it in several ways. :file:`latlon.py` does something similar but for a latitude/longitude pair, using SOAP, and requesting more data. .. _ex_tmsxtvd: Television Schedules (Tribune Media Services) ============================================= A commercial service for `television listings `_. Only one sample document is available for testing; it is retrieved using :file:`genbindings.sh`. The :file:`dumpsample.py` demonstrates extending a binding to add a custom method, and parsing content with both DOM and SAX. It also provides timing information; the document is about 200KB, and takes several seconds to parse. .. literalinclude:: ../examples/tmsxtvd/dumpsample.py .. _ex_geocoder: Address-To-Latitude/Longitude (http://geocoder.us) ===================================================== This service provides the latitude and longitude for free-form US addresses. It also demonstrates several of the pitfalls of using WSDL, which has a very lax concept of schemas, with a system that expects to operate on validatable documents. The following changes were made to make the service easier to work with: - Change the element form default to ``qualified``. This is necessary because there is a non-absent target namespace in the schema, and the documents returned from the service set it as the default namespace. This causes the XML engine to associate that namespace with locally-scoped elements like "number", while the original ``unqualified`` form default caused the schema to record them with no namespace. - Set ``minOccurs`` on all the elements, since some are missing from some responses - Set ``nillable`` on all elements that are observed to use ``xsi:nil="true"`` in response documents - Provide types and elements corresponding to the request and response messages, since PyXB's WSDL support does not currently generate them from the operation messages. :file:`genbindings.sh` applies changes to the WSDL after retrieving it and prior to generating the bindings. A second complication is the need to burrow down through wildcard elements in the binding instance generated from the SOAP response. This is the consequence of an `error in the WSDL specification `_, which was discovered after too many tools had already worked around it. Currently, PyXB also requires that you work around it manually, although a customization of the relevant SOAP encoding class could make it unnecessary. .. literalinclude:: ../examples/geocoder/client.py .. _ex_opengis: OpenGIS (http://www.opengeospatial.org) ======================================= See the directory ``examples/OpenGIS`` in the distribution. PyXB-1.2.6/doc/html/_sources/legal.txt0000644000175000017500000000247013152762205017056 0ustar pabpab00000000000000License and Disclaimers ----------------------- .. _pyxb-license: License ^^^^^^^ PyXB as a whole is made available under the `Apache License v 2.0 `_. For full details see the LICENSE file in the distribution. PyXB uses the `six ` module for Python 2/3 Compatible Source support. About the Demonstration Web Services ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ There seem to be very few free public web services that are maintained and provide an interesting capability that does not require significant effort to demonstrate in an satisfactory way. The :ref:`examples` in the PyXB documentation refer to web services found through `Google `_ and other search engines. Some of these services are free; for others the API schemas could be obtained by anonymous download but use of the service would require a paid subscription. These web services are used for demonstration purposes only. If you represent a company providing one of these services and object to its use in this way, email the developer to have the service references removed. If you provide interesting web services and would like to contribute to open source development and the promotion of web services by explicitly permitting this use, email the developer. PyXB-1.2.6/doc/html/_sources/overview.txt0000644000175000017500000000022313152762205017632 0ustar pabpab00000000000000******** Overview ******** .. toctree:: :maxdepth: 2 overview_what overview_how bundles limitations legal vision related PyXB-1.2.6/doc/html/_sources/userref_usebind.txt0000644000175000017500000002754113152762205021164 0ustar pabpab00000000000000.. _usebind: Using Binding Classes ===================== Python instances corresponding to XML structures can be created in two primary ways: from XML documents, and directly within Python code. Generating XML documents from bindings can also be controlled. .. _from-xml: Creating Instances from XML Documents ------------------------------------- XML documents are converted into Python bindings by invoking the ``CreateFromDocument`` function in a binding module. For example: .. literalinclude:: ../examples/manual/demo3.py The ``CreateFromDocument`` function in a given binding module is configured so that documents with no default namespace are assumed to be in the namespace from which the binding was generated. .. _invalid-content: Locating Invalid Content ^^^^^^^^^^^^^^^^^^^^^^^^ If a document does not validate, PyXB will generally through an :py:obj:`pyxb.UnrecognizedContentError` exception. You can determine where the problem lies, and what was not recognized, by examining attributes present on the exception as shown in this example: .. literalinclude:: ../examples/manual/badcontent.py which produces: .. literalinclude:: ../examples/manual/badcontent.out Coping With Wrong ``xsi:type`` Attributes ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Some web services and binding tools mis-use `xsi:type `_, providing attribute values that either are not types, or do not specify a type that is derived from an abstract type. The :py:obj:`pyxb.namespace.builtin.XMLSchema_instance.ProcessTypeAttribute ` method can be used to relax how PyXB processes those attributes. .. _from-python: Creating Instances in Python Code --------------------------------- Creating bindings from XML documents is straightforward, because the documents contain enough information to identify each element and attribute, locate the corresponding use in the binding class, and store a value that is converted to the appropriate type. Creating values in Python is inherently more complex, because native Python objects like strings and integers do not contain this information. As described in :ref:`bindingModel`, binding classes corresponding to simple types extend the underlying Python type (such as ``str`` or ``int``), and add XML-specific information like the canonical representation of the value in `Unicode `_, which is the natural representation as XML text. These classes also maintain a set of facets that constrain the values that can be stored as instances when validation is active. Binding classes for complex types have constructors that parse positional and keyword parameters to determine the appropriate element or attribute to which the value belongs. Attributes are assigned using keyword parameters. Content is assigned using positional parameters. The order of the positional parameters must be consistent with the order expected by the content model. Using the schema in the :ref:`namespace-aware address schema `, we can begin to construct the example document in Python: .. literalinclude:: ../examples/manual/demo4a.py .. note:: It is necessary to provide an ``element_name`` parameter to ``to_xml`` because in this case ``USAddress`` is the name of a complex type, not an top-level schema element. PyXB cannot generate XML for an instance unless it knows the name to use for the root element. In most situations PyXB can figure out what element the instance belongs to, as when the instance is created through an element binding instead of a type binding and when it is assigned into another instance, both of which are seen in `demo4c`_. This produces: .. literalinclude:: ../examples/manual/demo4a.out Assigning to individual fields like this bypasses the complex type content model, although each field itself is validated. For example, the address schema does not include New York as a state, so the following assignment:: addr.state = 'NY' will cause a :py:obj:`pyxb.exceptions_.BadTypeValueError` exception to be raised: .. literalinclude:: ../examples/manual/demo4a1.out However, the order of the field assignments does not matter, as long as all required fields are present by the time the XML document is generated. .. literalinclude:: ../examples/manual/demo4a2.py Alternatively, you can provide the content as positional parameters in the object creation call: .. literalinclude:: ../examples/manual/demo4b.py This has the same effect, and is much more compact, but it does require that the order match the content model. .. _demo4c: Attributes are set using keyword parameters: .. literalinclude:: ../examples/manual/demo4c.py This example produces (after reformatting): .. literalinclude:: ../examples/manual/demo4c.out .. index:: pair: disabling; validation Note that, because we're in the middle of the example and have not provided the ``items`` element that the content model requires, the code :py:obj:`explicitly disables the requirement for validation ` when generating XML from a binding instance. A consequence of this is that the generated XML is not valid, and validation must be :py:obj:`disabled for parsing ` as well if the resulting document is to be re-converted into a binding with ``CreateFromDocument``. .. _pyxb_BIND: Creating Instances of Anonymous Types ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ The style of XML schema used for purchase orders uses anonymous types for the deeper elements of the purchase order: .. literalinclude:: ../examples/manual/po4.xsd .. index:: single: BIND In particular, there is no global ``item`` element that can be used to create the individual items. For situations like this, we use :py:obj:`pyxb.BIND`: .. literalinclude:: ../examples/manual/demo4c1.py The :py:obj:`pyxb.BIND` reference wraps the content of the inner elements, and is a cue to PyXB to attempt to build an instance of whatever type of object would satisfy the content model at that point. The resulting document (after reformatting) is: .. literalinclude:: ../examples/manual/demo4c1.out The complete document is generated by the following program: .. literalinclude:: ../examples/manual/demo4c2.py The additional code demonstrates a couple additional features: - Fixed attribute values (such as ``country``) are present in the bindings, even though they are only printed if they are set explicitly - The PyXB types for representing dates and times are extensions of those used by Python for the same purpose, including the ability to use them in expressions .. _to-xml: Creating XML Documents from Binding Instances --------------------------------------------- All along we've been seeing how to generate XML from a binding instance. The ``toxml`` method is short-hand for a sequence that converts the binding to a DOM instance using ``xml.dom.minidom``, then uses the DOM interface to generate the XML document. The :py:obj:`pyxb.utils.domutils.BindingDOMSupport` class provides ways to control this generation. In particular, you may want to use something more informative than ``ns#`` to denote namespaces in the generated documents. This can be done using the following code: .. literalinclude:: ../examples/manual/demo4c3.py :lines: 20- With this, the final document produced is: .. literalinclude:: ../examples/manual/demo4c3.out (Surprise: ``addr`` does not appear, because the ``nsaddress.xsd`` schema uses the default element form ``unqualified``, so none of the address components in the document have a namespace.) .. _mixed_content: Influencing Element and Mixed Content Order ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ PyXB generally expects that any information reflected in the order of elements is controlled by the content model in the schema. Where content includes multiple instances of the same element, they are maintained in order within the binding attribute corresponding to the name. Historically relative order with other elements or with mixed content historically was not rigorously maintained, and generated documents applied only the order enforced by the content model. The following example from ``examples/xhtml/generate.py`` hints at the difficulty: .. literalinclude:: ../examples/xhtml/generate.py If the relative order of elements and mixed content were not maintained, this might produce something like: .. literalinclude:: eltonly.xhtml Here mixed content is lost, and element content is emitted in the order that elements appear in the original schema. As of release 1.2.1 [#content]_, PyXB appends both element and non-element content to a list in each complex binding instance. The list may be obtained using the :py:obj:`orderedContent ` method. The list comprises instances of :py:obj:`pyxb.binding.basis.ElementContent` and :py:obj:`pyxb.binding.basis.NonElementContent` added in the order in which they were added to the binding instance: when creating the instance from a document or through a constructor, or by invoking the :py:obj:`append ` or :py:obj:`extend ` methods to add content consistent with the content model. The :py:obj:`contentInfluencesGeneration ` flag of :py:obj:`pyxb.ValidationConfig` controls how the ``orderedContent`` list affects generation of documents (both DOM directly and XML indirectly). With the default value of :py:obj:`MIXED_ONLY ` the ``orderedContent`` list is only consulted when a complex type allows both element and non-element content. The bundle for XHTML has been modified to use: - :py:obj:`ALWAYS ` for :py:obj:`contentInfluencesGeneration ` - :py:obj:`RAISE_EXCEPTION ` for :py:obj:`orphanElementInContent ` - :py:obj:`RAISE_EXCEPTION ` for :py:obj:`invalidElementInContent ` for all binding classes in that module. (See ``pyxb/bundles/common/xhtml1.py`` for the technique used.) This ensures preservation of element order in cases where no non-element content may appear (such as the top-level ``body`` element). With this capability the following document is generated: .. literalinclude:: ../examples/xhtml/expout.xhtml Be aware that the automatically-maintained ``orderedContent`` list will be incorrect in at least two cases: - When the elements of an instance are mutated through Python code, the list no longer reflects the correct order; - When elements are appended directly to sub-elements as with: .. code-block:: python p2.b.append('another bit of bold') the newly added elements do not appear in the ``orderedContent`` list. The value returned by :py:obj:`orderedContent ` is a mutable list so that you can manipulate it to reflect the content you wish to have generated. Where the ``orderedContent`` list is not consistent with the content model (e.g., references elements that are no longer part of the binding instance, or proposes an order that is not valid) various exceptions may arise. To some extent this can be controlled through the :py:obj:`orphanElementInContent ` and :py:obj:`invalidElementInContent ` flags. .. [#content] Though previous versions also provided this information through a ``content`` list, the list did not associate content with the element to which it belonged making it difficult to reconstruct a valid document. .. ignored ## Local Variables: ## fill-column:78 ## indent-tabs-mode:nil ## End: PyXB-1.2.6/doc/html/_sources/arch_component.txt0000644000175000017500000001111013152762205020760 0ustar pabpab00000000000000.. _componentModel: Component Model =============== PyXB's component model is the representation of XML schema components as a complex relation of data objects. Each object class corresponds to one of the thirteen `XML Schema Components `_, and names of components and their properties follow those definitions. All classes specific to the component model are found in the :py:obj:`pyxb.xmlschema.structures` module. The relationships amongst components is depicted in the following diagram. Composite aggregation generally denotes ownership and shared aggregation reference, but don't look for consistency. .. image:: Images/ComponentModel.jpg Component Model Mix-ins ----------------------- A variety of :ref:`mixins` are used to allow common code to be abstracted or to mark objects as having certain capabilities. These mixins are: - :py:obj:`pyxb.xmlschema.structures._SchemaComponent_mixin` marks the object as being a schema component and holds its :py:obj:`pyxb.namespace.NamespaceContext`. It also records relations between components in a global definition and their clones where those definitions are expanded. - :py:obj:`pyxb.xmlschema.structures._Singleton_mixin` is used to ensure there is only one instance each of the `simple ur-type `_ and `ur-type `_. It overloads ``__new__`` to ensure that only one instance of the class is ever constructed. - :py:obj:`pyxb.xmlschema.structures._Annotated_mixin` provides the support for all components that contain an `annotation `_ as a child element. - :py:obj:`pyxb.xmlschema.structures._NamedComponent_mixin` supports components that can be identified by name. This includes the target namespace (which may be anonymous) if the component is global, and the `complex type definition `_ that serves as the component's `scope `_ when it is local. - :py:obj:`pyxb.xmlschema.structures._ValueConstraint_mixin` provides support for components that have `value constraints `_ : that is, provide a default value and optionally require a fixed value. - :py:obj:`pyxb.xmlschema.structures._ScopedDeclaration_mixin` is used by `element declarations `_ and `complex type definitions `_ which may be named but only referenceable within a specific `scope `_. - :py:obj:`pyxb.xmlschema.structures._AttributeWildcard_mixin` provides support for `attribute group definitions `_ and `complex type definitions `_, both of which allow `wildcard `_ attributes. Other Information ----------------- Most of the important information about the component model is best obtained from the `specification `_ or from the :py:obj:`PyXB component model API `. Tidbits of other relevant information: - An understanding of :ref:`resolution` is important. - Element and attribute declarations that are incorporated by reference are represented in local scope by a copy of the global declaration. This aids in the infrastructure that binds declarations from model and attribute groups to a specific context. Local declarations are associated only with the complex type in which they appear; types that extend or restrict that type refer to the declaration instance associated with the base type. - PyXB strictly enforces the `requirement `_ that multiple element declarations within a complex type be compatible with respect to type and other attributes. Since occurrence restrictions are associated with a `Particle `_ instance rather than the declaration, the same element can appear in multiple places with different multiplicities. Note, though, that the default code generation module collapses all occurrences of any given element into a single Python field in the binding. .. ignored ## Local Variables: ## fill-column:78 ## indent-tabs-mode:nil ## End: PyXB-1.2.6/doc/html/_sources/userref_validating.txt0000644000175000017500000001160113152762205021643 0ustar pabpab00000000000000.. _validating: Debugging Validation Errors =========================== .. note:: This material should be expanded in a future release when :ticket:`trac/171 <171>` is addressed. In the 1.1.x release series of PyXB a common and valid complaint was that PyXB would validate documents and binding instances, but did not provide useful information explaining why a particular document was invalid. The content validation approach described in :ref:`validating-content` allows the application to diagnose: - the element or instance data that failed to satisfy the content model; - the location of that element within a document being parsed; - the point in the XML schema where the containing complex type was defined; - the content that was expected to have been encountered. Perhaps the quickest way to see the information PyXB now provides is to look at the :ref:`ex_ndfd` example, and in particular the ``latlon.py`` script. This script uses WSDL to obtain the near-term forecast for a location within the United States using latitude and longitude. In the course of validating PyXB 1.2.0, it was discovered that the National Weather Service has added some new elements to their schema, with the result that the servers no longer provide valid XML: in particular, order constraints on individual forecast characteristics are violated. This caused the example to fail. While the script needs to be cleaned up considerably, the following code block shows how the retrieved XML document is converted into a binding instance: .. code-block:: python # Create the binding instance from the response. If there's a # problem, diagnose the issue, then try again with validation # disabled. r = None try: r = DWML.CreateFromDocument(rxml) except pyxb.UnrecognizedContentError as e: print '*** ERROR validating response:' print e.details() if r is None: pyxb.RequireValidWhenParsing(False) r = DWML.CreateFromDocument(rxml) When invoking the program, the following diagnostic output is provided through the :py:obj:`details ` method: .. code-block:: none :linenos: *** ERROR validating response: The containing element parameters is defined at ndfd_data.xsd[29:12]. The containing element type parametersType is defined at parameters.xsd[21:4] The unrecognized content probability-of-precipitation begins at [217:6] The parametersType automaton is in an accepting state. The following element and wildcard content would be accepted: An element cloud-amount per parameters.xsd[379:12] An element humidity per parameters.xsd[416:12] An element weather per parameters.xsd[449:12] An element conditions-icon per parameters.xsd[566:12] An element hazards per parameters.xsd[585:12] An element wordedForecast per parameters.xsd[701:11] An element pressure per parameters.xsd[715:12] An element probabilisticCondition per parameters.xsd[751:12] An element water-state per parameters.xsd[785:12] This tells the user that: 2. A problem was encountered processing an element ``parameters`` from an element declaration found in the ``ndfd_data.xsd`` schema starting at column 12 on line 29. 3. The ``parameters`` element is of type ``parametersType``, and its content model can be found in the complex type definition in the ``parameters.xsd`` schema starting on line 21. 4. The error in the document was failure to recognize an element ``probability-of-precipitation`` which was found at line 217 of the input. (The document is being parsed from a Python string, so no URI is available). 5. Had the containing ``parameters`` element ended before this point, the element would be valid. 6. The names and definition locations of element data that would have been acceptable at that point follow in lines 7 through 15. A much shorter but still useful synopsis of the invalidity would be available through the ``str`` operation on the exception. Full details are available through attributes on the :py:obj:`UnrecognizedContentError ` and other exceptions. In cases where the service generating the documents is under your control, you can use this information to correct the documents. In cases like this where the error is in a production server, the proper approach is to `report the error `_, disable validation, and move on with ones life. Runtime Exception Hierarchy --------------------------- Details on the interfaces presented by these exceptions can be found through the :py:obj:`API Documentation `. .. image:: Images/RuntimeExceptions.jpg .. image:: Images/CTDValidationExceptions.jpg .. ignored ## Local Variables: ## fill-column:78 ## indent-tabs-mode:nil ## End: PyXB-1.2.6/doc/html/_sources/arch_binding.txt0000644000175000017500000004007213152762205020401 0ustar pabpab00000000000000.. _bindingModel: Binding Model ============= The binding model represents the relations between Python classes that correspond to schema components. The class hierarchy for the binding model is depicted in the following diagram. .. image:: Images/BindingModel.jpg There are three primary groups of classes, which in turn depend on some supporting capabilities, all of which are described in the following sections. Supporting Capabilities ----------------------- Common Binding Instance Features ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ :py:obj:`pyxb.binding.basis._TypeBinding_mixin` is a marker class to indicate that the incorporating class represents a binding associated with a type definition (whether simple or complex). The key features of this mixin are: - The :py:obj:`_ExpandedName ` class variable is overridden in each class to identify the type definition corresponding to the class. - The :py:obj:`_XSDLocation ` class variable is overridden in each class to provide the line, column, and schema at which the data type definition was found. This is used in diagnostics. - The :py:obj:`namespace context ` of the type definition is recorded to allow users to perform QName resolution of values within instance documents (see, for example, the customized bindings in ``pyxb.bundles.wssplat.wsdl11``). - Each instance records the :py:obj:`pyxb.binding.basis.element` instance that determines where the type came from. The element is required in order to provide the correct name when converting the binding instance to a DOM instance on its way to expression as a text XML document. - The mixin is also where `xsi:nil `_ information for the instance is stored. - A :py:obj:`Factory ` infrastructure is provided to allow creation of new instances of the binding while permitting developers to customize the generated binding classes; see :ref:`binding_customization`. .. _binding_deconflictingNames: Deconflicting Names ^^^^^^^^^^^^^^^^^^^ In XML schema, the namespaces for element declarations, type definitions, and attribute definitions are all distinct. Python uses the same namespace for everything. So, if you have a schema that defines a simple type ``color``, the schema can also have an element named ``color`` with a complex type that itself has both a child element named ``color`` and a distinct attribute (of type ``color``) that is also named ``color``. Since the natural representation of elements and attributes inside complex types is also by their XML name, the chances of conflict are high. PyXB resolves this by ensuring every identifiable object has a unique identifier within its context. The steps involved are: #. Make object name into an :py:obj:`identifier ` by stripping out non-printable characters, replacing characters that cannot appear in identifiers with underscores, stripping leading underscores, and prefixing an initial digit with the character ``n``. #. :py:obj:`Deconflict ` the resulting identifier from Python :py:obj:`reserved identifiers ` and other context-specific keywords. #. Prepend the standard prefix that denotes the identifier's :ref:`visibility ` (public, protected, private) #. Make the resulting identifier :py:obj:`unique ` within its context (containing class or module). These steps are encapsulated into a single function :py:obj:`pyxb.utils.utility.PrepareIdentifier` which takes parameters that customize the context for the identifier. In addition to name conflicts with namespace-global identifiers appearing directly in the module, conflicts may also appear within a binding class as a result of collision with names from Python keywords, public class names, and public field or method names in the class. The :py:obj:`pyxb.utils.utility._DeconflictSymbols_mixin` is used to refine the set of type-specific public names. If you customize a generated binding class by extending from it, you must specify your own class variable ``_ReservedSymbols`` with a value that is the union of your symbols and those of the superclass(es) (see :py:obj:`pyxb.utils.utility._DeconflictSymbols_mixin` for details). Deconfliction of module-level names occurs prior to :py:obj:`code generation `. Identifiers are deconflicted in favor of higher items on this list: - Python keywords - Public class identifiers - Element tags - Complex or simple type definition tags - Enumeration tags - Attribute tags .. _binding_customization: Support for Customization ^^^^^^^^^^^^^^^^^^^^^^^^^ One of the primary goals of PyXB is to support Python modules which customize the generated bindings by adding both functionality and derived content. Maintenance issues require that these extensions exist separately from the automatically-generated binding modules; usability requires that they inherit from the automatically-generated modules. This is supported by the :py:obj:`pyxb.binding.basis._DynamicCreate_mixin` class. This class provides a :py:obj:`method ` which is used by the generated bindings to create new instances of themselves. The raw bindings are generated into a sub-module with the prefix ``raw``, and the extensions modify the generated class to record the real class that should be used when new instances are created as a result of converting an XML document into a binding object. For example, if a binding is to be created in a module ``dinner``, the ``--generate-raw-binding`` flag would be used on :ref:`pyxbgen ` to generate the binding in a file named ``raw/dinner.py``. The wrapper module ``dinner.py`` would contain the following code (assuming that the class ``parsnip`` was to be extended):: # Bring all public symbols up from the generated one from raw.dinner import * # Bring them in again, but left with their original module path import raw.dinner # Replace the generated parsnip with a customizing extension class parsnip (raw.dinner.parsnip): # Customization here pass # Register the customization for use by the binding infrastructure raw.dinner.parsnip._SetSupersedingClass(parsnip) With this pattern, objects created by the user through ``dinner.parsnip()`` and from XML documents by the ``CreateFromDOM`` infrastructure will both be instances of the extending wrapper class. Simple Type Definitions ----------------------- `Simple type definitions `_ derive from :py:obj:`pyxb.binding.basis.simpleTypeDefinition` and a standard Python type. For simple types that are not derived by list or union, you can construct instances using the :py:obj:`Factory ` method or directly, providing the value as an argument. New instance creation is validated against the `facets `_ recorded in the binding class. Constraining Facets ^^^^^^^^^^^^^^^^^^^ Each class corresponding to a simple type definition has class variables for the `constraining facets `_ that are valid for that class. These variables are named by prefixing the facet name with ``_CF_``, and have a value that is an instance of the corresponding :py:obj:`facet class `. Where possible, the variables are inherited from the parent class; when a simple type is derived by restriction, the restricted class overrides its parent with a new value for the corresponding facet. Facets incorporate schema-specific constraining values with some code that validates potential instances of the type against the constraints. Constraining values may: - be of a fixed type, as with `length `_; - take on a value in the value space of the simple type in which the facet appears, as with `minInclusive `_; or - take on a value in the value space of the superclass of the simple type in which the facet appears, as with `minExclusive `_; Enumeration and pattern constraints maintain a list of the respective acceptable enumeration and pattern values. Facets implement the :py:obj:`pyxb.binding.facets.ConstrainingFacet.validateConstraint` method, which in turn is invoked by the :py:obj:`pyxb.binding.basis.simpleTypeDefinition.XsdConstraintsOK` class method when given a value that may or may not satisfy the constraints. The :py:obj:`Factory ` will normally validate the constraints before allowing a new instance to be returned. List Types ^^^^^^^^^^ Simple types that derive by `list `_ extend from :py:obj:`pyxb.binding.basis.STD_list` which in turn descends from the Python ``list`` type. These derived classes must override the base class :py:obj:`pyxb.binding.basis.STD_list._ItemType` value with the appropriate class to use when creating or validating list members. When constructing an instance of a simple list type, you can provide a list as the initializer. The members of the list must be valid initializers to the underlying item type. Union Types ^^^^^^^^^^^ Union types are classes that are never instantiated. Instead, the binding classes define a :py:obj:`pyxb.binding.basis.STD_union._MemberTypes` variable which contains a list of binding classes that are permitted as members of the union. The :py:obj:`pyxb.binding.basis.STD_union.Factory` method attempts, in turn, to create an instance of each potential member type using the arguments passed into it. The returned value is the first instance that was successfully created. Note that this means the fact that a particular attribute in an element is a member of a union is not recorded in the attribute value. See :ref:`attributeUse`. It is not possible to construct an instance of a union type directly. You must use the :py:obj:`Factory ` method, with an argument that is acceptable as an initializer for one of the member types. Complex Type Definitions ------------------------ `Complex type definitions `_ derive from :py:obj:`pyxb.binding.basis.complexTypeDefinition`. Classes representing complex type definitions record maps that specify :py:obj:`attribute ` and :py:obj:`element ` use structures to record the attributes and elements that comprise the type. Each such structure is stored as a private class field and is used by Python properties to provide access to element and attribute values in a binding instance. The base :py:obj:`pyxb.binding.basis.complexTypeDefinition` class provides the infrastructure to identify the appropriate attribute or element given an XML tag name. For classes corresponding to types that enable `wildcards `_, it also provides a mechanism to access unrecognized elements and attributes. :py:obj:`Wildcard elements ` are converted to binding instances if their namespace and name are recognized, and otherwise are left as DOM nodes. :py:obj:`Wildcard attributes ` are stored in a map from their :py:obj:`expanded name ` to the unicode value of the attribute. When creating a complex type definition, you can provide the values for its attributes and fields through arguments and keywords. Keywords whose name matches an attribute or element identifier are used to set that element, bypassing the content model. Arguments are processed in order using the content model for identification and validation. See the :ref:`example below `. Elements ^^^^^^^^ Each element corresponds to a field in the binding instance; the field is managed through a :ref:`element declaration ` structure. Element names are disambiguated, and a Python property is defined to retrieve and set the element value. When the content model permits multiple occurrences of the element, its value is a Python list. The order in this list is significant. Attributes ^^^^^^^^^^ Each attribute corresponds to a field in the binding instance; the field is managed through a :ref:`attribute use ` structure. Attribute names are disambiguated, and a Python property is defined to retrieve and set each attribute value. Note that if the same name is used for both an attribute and an element, the element use takes priority. See :ref:`binding_deconflictingNames`. Simple Content ^^^^^^^^^^^^^^ Complex types with simple content (i.e., those in which the body of the element is an octet sequence in the lexical space of a specified simple type) are distinguished by providing a value for the class-level :py:obj:`pyxb.binding.basis.complexTypeDefinition._TypeDefinition` variable. For these types, the :py:obj:`pyxb.binding.basis.complexTypeDefinition.content` method returns the instance of that type that corresponds to the content of the object. Users of bindings must be aware of whether a particular value is a true simple type, or a complex type with simple content. In the former case, the value descends from the corresponding Python type and can be used directly in Python expressions. In the latter, the value must be retrieved using the ``value`` method before it can be used. As an example, consider this schema (available in :file:`examples/content`): .. literalinclude:: ../examples/content/content.xsd With the generated bindings, the following program: .. _ex_showcontent: .. literalinclude:: ../examples/content/showcontent.py produces the following output: .. literalinclude:: ../examples/content/showcontent.out Note that it was necessary to indicate that the second member (``complex``) of the ``numbers`` element needs to be wrapped in an instance of the appropriate complex type. Similarly, it was necessary to add the call to ``value()`` on the value of ``v.complex`` in order to get a valid Python numeric value. This was not necessary for ``v.simple`` or ``v.attribute``. Mixed and Element-Only Content ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `Mixed and element-only content `_ nodes use the :py:obj:`pyxb.binding.basis.complexTypeDefinition._ElementBindingDeclForName` method to manage the mapping from XML schema element names to class members. The element and attribute names are distinct. Instances of complex types also reference a :py:obj:`content automaton ` to ensure the constraints of the schema are satisfied. These structures are described in :ref:`contentModel`. For these types, the :py:obj:`pyxb.binding.basis.complexTypeDefinition.content` method returns a list, in parsed order, of the Python objects and (if mixed) non-element content that belong to the instance. Be aware that this order currently does not influence the order of elements when converting bindings into XML. Elements -------- Unlike the bindings for schema type definitions, which are represented as Python classes, bindings corresponding to XML Schema element declarations are represented as instances of the :py:obj:`pyxb.binding.basis.element` class. The instances can be used to create new binding instances that are associated with the element. Elements are used in the content model to identify transitions through a finite automaton. You can use elements just like types in that they are invokable, with arguments corresponding to the arguments of the constructor of the corresponding type. See :ref:`the example above `. .. ignored ## Local Variables: ## fill-column:78 ## indent-tabs-mode:nil ## End: PyXB-1.2.6/doc/html/_sources/maintref.txt0000644000175000017500000002061313152762205017576 0ustar pabpab00000000000000******************** Maintainer Reference ******************** .. _git_repository: Git Repository ************** PyXB is developed using `git `_ with active development hosted on `Github `_. Public development is mostly done on the ``next`` branch, which is the default for cloned checkouts. The ``master`` branch contains material integrated into the release, and follows ``next``. Tags for each release are in the format ``PyXB-X.Y.Z``. Bug fixes with unit tests are pushed to the ``next`` branch as soon as they are fixed. Users whose reported issues have been fixed are encouraged to use the development branch until the fix has been made available in a tagged and packaged release. Coding Practices **************** The practices described herein are *intended* to be used, but evolved over time, and not all are followed in every situation. Style ===== PyXB follows generally uses a coding style consistent with those described in the Python coding standard in :PEP:`8`. Specific exceptions are listed below. Whitespace ---------- The pet peeves of PyXB's maintainer differ from the `BDFL `_'s when it comes to whitespace. Spaces are used around operators to reveal precedence assumptions, and sometimes around parenthesis to distinguish tuple value boundaries:: hypot2 = x*x + y*y pair_of_pairs = ( (a, b), (b, c) ) Definitions of methods and classes always use a space before the parenthesis; invocations never do: :: def declaration (self, recurse=False): if recurse: self.declaration(False) .. _identifier_naming: Naming ------ PyXB heavily uses a single leading underscore as an indication of protected/friend status, as suggested in :PEP:`8`. Wherever possible, double leading underscores are used to hide class member fields, restricting access to them through protected or public accessor methods. Class members that are specifically *class* (as opposed to *instance*) members begin with a capital letter. An underscore is used to separate the descriptive class or function name from a suffix that indicates its use. Standard suffixes are: - ``mixin`` : A class that does not stand alone, but is a superclass of one or more classes - ``csc`` : A method that uses :ref:`cooperative super calling` - ``vx``, ``vb`` : An indication that the method is expected to be overridden in a subclass. Exceptions ========== PyXB provides a `standard exception hierarchy `_ that extends the one built into Python. Where an execution branch has been identified that requires behavior that has not yet been implemented, raise an :py:obj:`pyxb.exceptions_.IncompleteImplementationError`. At the current stage of development, these should be extremely rare. Where the system detects that a precondition is not satisfied, processing must stop. If the precondition failure is due to improper use of the PyXB internal or public API, a :py:obj:`pyxb.exceptions_.LogicError` should be raised. If the precondition failure is due to invalid input from the schema, a :py:obj:`pyxb.exceptions_.SchemaValidationError` should be raised. If the precondition is inexplicably false, Python's ``assert`` functionality may be used. Use of ``assert`` should be rare, and only in places that are guaranteed to be exercised during the course of testing. The exception behavior of methods SHOULD be documented. Documentation of asserts is not required. Annotations =========== Use decorators (:PEP:`318`) to mark class methods. Note that this restricts us to Python 2.4 or later. Sigh with disappointment and move on. Documentation ============= Use Sphinx-compatible documentation for all public and implementation-shared methods and classes. (Formerly, this was "Use the `Epytext Markup Language `_" but epydoc hasn't been updated since before PyXB was born. Few if any modules have been converted. ) (Formerly, this was "Use docstrings :PEP:`257`". Documentation in only a few modules has been converted.) Comments ======== Use comments copiously. Do not duplicate detailed information from standards, but do include pertinent summaries and a reference to the section in which the details can be found. The casual reader should not be forced to open the standard to figure out what the coder intended to accomplish. Terminology =========== The term "attribute" has different meanings in Python and XML. tag : Refers to the text that opens an XML element instance : [as an adjective] Refers to a characteristic of an instance of a Python class. class : [as an adjective] Refers to a characteristic of a Python class itself, shared among all instances. field : Refers to a named attribute of a Python object (class). When the attribute holds a value, it is an "instance (class) variable" or "instance (class) field". When it holds a reference to an invokable object, it is an "instance (class) method". Use of new-style classes ======================== Too many things, such as clean hooking into the pickling system, require the use of `new-style classes `_. Namespaces, schema components, and types (simple and complex) all use new-style classes. For this to work properly, if you implement an ``__init__`` method, it must take arbitrary args and keywords, invoke ``super(Class, self).__init__(*args,**kw)``, and extract any arguments it needs from the keywords. If you do not need to do anything in the init method, leave it out. See `this commentary `_ for a detailed description of the intricacies of ``super``. Inheritance =========== .. _mixins: Mix-in classes -------------- PyXB makes heavy use of multiple inheritance through `mix-in classes `_. If there are constraints on where the mix-in must appear in the method resolution order (mro), note that clearly in the mix-in documentation. .. _coding_csc: Invoking Superclass Instances ----------------------------- `Cooperative super calling `_ is a pattern where a class may inherit multiple implementations of the same method, and want to call all of them. Normally this is done by invoking the parent class implementation before or after the subclass implementation. In non-trivial inheritance hierarchies (as result from using many mix-ins), it's not obvious who the next parent to call is, so the Python ``super`` function is used. However, at some point a class will be reached that has no more definitions for the called method, and attempting to invoke one would produce an ``AttributeError``. Use the following idiom to conditionally invoke superclass methods when you are not sure the superclass has such a method. :: def method_csc (self, *args, **kw): super_fn = getattr(super(ThisClass, self), 'method_csc', lambda *a,**kw: self) return super_fn(*args, **kw) Note the use of the ``_csc`` suffix to highlight that this method uses cooperative super calling. Class Variables At Multiple Levels ---------------------------------- There are several cases where we want to store information in a class, but allow subclasses (not instances) to override it. An example is in the :py:obj:`pyxb.binding.basis.simpleTypeDefinition` hierarchy where each class maintains a set of :py:obj:`pyxb.binding.facets.ConstrainingFacet` instances that are available for constraining values of the class. In many cases, a subclass will not change the set of facets that affect instances, so we want to be able to inherit the parent class map; but in other cases we may need to add constraints that only affect the new class and its descendents. This sort of thing is supported by implementing a private class method in the base class which combines the dynamically-determined actual class name with a constant identifier and uses ``getattr`` and ``setattr`` to access the class-specific value. Type declarations may extend a type of the same name in a different namespace. If they do so, their binding classes will likely have the same name, but in different modules, while also inheriting (in exactly the situation where we want different values). For this reason, the constructed attribute name should also incorporate the module or namespace, something normally not done with the double-underscore feature of Python. PyXB-1.2.6/doc/html/_sources/pyxb.namespace.txt0000644000175000017500000000152313152762205020705 0ustar pabpab00000000000000pyxb\.namespace package ======================= Submodules ---------- pyxb\.namespace\.archive module ------------------------------- .. automodule:: pyxb.namespace.archive :members: :undoc-members: :show-inheritance: pyxb\.namespace\.builtin module ------------------------------- .. automodule:: pyxb.namespace.builtin :members: :undoc-members: :show-inheritance: pyxb\.namespace\.resolution module ---------------------------------- .. automodule:: pyxb.namespace.resolution :members: :undoc-members: :show-inheritance: pyxb\.namespace\.utility module ------------------------------- .. automodule:: pyxb.namespace.utility :members: :undoc-members: :show-inheritance: Module contents --------------- .. automodule:: pyxb.namespace :members: :undoc-members: :show-inheritance: PyXB-1.2.6/doc/html/_sources/pyxb.xmlschema.txt0000644000175000017500000000055513152762205020736 0ustar pabpab00000000000000pyxb\.xmlschema package ======================= Submodules ---------- pyxb\.xmlschema\.structures module ---------------------------------- .. automodule:: pyxb.xmlschema.structures :members: :undoc-members: :show-inheritance: Module contents --------------- .. automodule:: pyxb.xmlschema :members: :undoc-members: :show-inheritance: PyXB-1.2.6/doc/html/_sources/userref_pyxbgen.txt0000644000175000017500000003533013152762205021202 0ustar pabpab00000000000000.. _pyxbgen: Generating Binding Classes ========================== The following sections reference example schema and programs that are available in the ``examples/manual`` subdirectory of the PyXB distribution. .. note:: PyXB is developed and tested assuming a POSIX file system, as is used on Linux. While PyXB works perfectly well on Windows, some accommodation is required. In particular, when providing file URIs as command-line arguments to ``pyxbgen`` it may be necessary to explicitly note that the parameter is a URI by using the `Windows file URI form `_ of the file path. For example, something like this will generally not work:: pyxbgen -m x -u "c:\\Windows\My Documents\x.xsd" # DO NOT USE This should be expressed as:: pyxbgen -m x -u file://c:/Windows/My%20Documents/x.xsd Self-contained schema --------------------- The following schema ``po1.xsd`` is a condensed version of the `purchase order schema `_ in the XMLSchema Primer: .. literalinclude:: ../examples/manual/po1.xsd Translate this into Python with the following command: .. literalinclude:: ../examples/manual/demo1.sh The :ref:`-u` parameter identifies a schema document describing contents of a namespace. The parameter may be a path to a file on the local system, or a URL to a network-accessible location like http://www.weather.gov/forecasts/xml/DWMLgen/schema/DWML.xsd. The :ref:`-m` parameter specifies the name to be used by the Python module holding the bindings generated for the namespace in the preceding schema. After running this, the Python bindings will be in a file named ``po1.py``. With the bindings available, this program (``demo1.py``): .. literalinclude:: ../examples/manual/demo1.py processing this document: .. literalinclude:: ../examples/manual/po1.xml produces the following output: .. literalinclude:: ../examples/manual/demo1.out Multi-document schema --------------------- Complex schema are more easy to manage when they are separated into multiple documents, each of which contains a cohesive set of types. In the example above, the ``USAddress`` type can be abstracted to handle a variety of addresses, and maintained as its own document ``address.xsd``: .. _address_xsd: .. literalinclude:: ../examples/manual/address.xsd The XMLSchema `include directive `_ can be used to incorporate this document into ``po2.xsd``: .. literalinclude:: ../examples/manual/po2.xsd Translation of this document and execution of the test program is just as it was in the previous section: .. literalinclude:: ../examples/manual/demo2.sh Note that you do not need to explicitly list the ``address.xsd`` file. PyXB detects the ``include`` directive and reads the second schema by resolving its ``schemaLocation`` relative to the base URI of the containing document. Because the contents of the two schema files belong to the same namespace, their combined bindings are placed into the ``po2.py`` module. Working with Namespaces ----------------------- Documents of significant complexity are likely to require references to multiple namespaces. Notice that the schemas we've looked at so far have :ref:`no namespace ` for both their target and default namespaces. The following schema ``nsaddress.xsd`` places the types that are in :ref:`address.xsd ` into the namespace ``URN:address`` by defining a `target namespace `_ then including the namespace-less schema: .. _nsaddress_xsd: .. literalinclude:: ../examples/manual/nsaddress.xsd Note that this technique takes advantage of the `chameleon schema `_ pattern. There are several ways you can prepare to process documents with multiple namespaces. If you have no expectation of using the imported namespace directly, you can process the importing schema just as before: .. literalinclude:: ../examples/manual/demo3a.sh PyXB will detect the ``import`` statement, read the corresponding schema, and create bindings for its types. However, since the ``pyxbgen`` invocation did not mention the ``URN:address`` namespace, the bindings are written into a :ref:`private ` binding file. The generated module file ``_address.py`` is created with a prefixed underscore indicating that it is not expected to be referenced directly. The public module ``po3.py`` will locally import module ``_address`` so that the required classes are available, but will not expose them to code that imports only module ``po3``. The demonstration program ``demo3.py`` shows that things work as expected without the new namespace being made explicit. .. literalinclude:: ../examples/manual/demo3.py More often, you will want to be able to import the module defining bindings from the additional namespaces. To do this, explicitly reference the additional schema and provide it with a module name: .. literalinclude:: ../examples/manual/demo3b.sh Here each namespace is represented in its own module (``address`` for ``URN:address`` and ``po3`` for module with an absent namespace). In this case, the demonstration program is unchanged; see :ref:`from-python` for additional examples. Sharing Namespace Bindings -------------------------- Most often, if you have a common utility namespace like ``URN:address``, you will want to generate its bindings once, and reference them in other schema without regenerating them. To do this, PyXB must be provided with an archive containing the schema components that were defined in that namespace, so they can be referenced in independent generation activities. To generate the archive, you add the :ref:`pyxbgen--archive-to-file` flag to the binding generation command: .. literalinclude:: ../examples/manual/demo3c1.sh In addition to generating the ``address`` Python module, this causes a :ref:`archive ` of the schema contents to be saved in the corresponding file, which by convention ends with the extension ``.wxs``. Any anonymous names that were generated with the bindings are also recorded in this archive, so that cross-namespace extension works correctly. You can then generate bindings for importing namespaces by providing PyXB with the information necessary to locate this archive: .. literalinclude:: ../examples/manual/demo3c2.sh The :ref:`pyxbgen--archive-path` directive indicates that the current directory (``.``) should be searched for files that end in ``.wxs``, and any namespaces found in such files implicitly made available for reference when they are encountered in an ``import`` instruction. (The second path component ``+`` causes the standard search path to be used after searching the current directory.) In this case, when the ``import`` instruction is encountered, PyXB detects that it has an archive ``address.wxs`` that defines the contents of the imported namespace. Instead of reading and processing the schema, it generates references to the existing binding modules. Again, the demonstration program is unchanged. Advanced Topics --------------- Schemas Defined in WSDL Documents ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ It is a common, if regrettable, practice that web services define the structure of their documents using XML schema elements encoded directly into a ``types`` element of a WSDL specification rather than having that elements import complete standalone schema. To accommodate this, pyxbgen supports the :ref:`pyxbgen--wsdl-location` argument as an alternative to :ref:`pyxbgen--schema-location`. For example, the following will generate a module ``ndfd`` containing bindings required to communicate with the `National Digital Forecast Database `_:: pyxbgen \ --wsdl-location=http://www.weather.gov/forecasts/xml/DWMLgen/wsdl/ndfdXML.wsdl --module=ndfd \ --archive-path=${PYXB_ROOT}/pyxb/bundles/wssplat//:+ Note that it will be necessary to have the :ref:`WS-* ` bindings available, as provided by the :ref:`pyxbgen--archive-path` option above. .. _customized_bindings: Customizing Binding Classes ^^^^^^^^^^^^^^^^^^^^^^^^^^^ PyXB permits you to customize the bindings that it generates by creating a module that imports the generated classes and instances, then extends them with subclasses with additional behavior. As long as you do not make major changes to the structure and names used in your namespaces, you can fine-tune the schema without changing the custom code. The :ref:`pyxbgen--write-for-customization` option causes PyXB to generate all the Python modules in a subdirectory ``raw``. Then you write a module that imports the generated bindings and extends them. Until this documentation is enhanced significantly, users interested in generating custom bindings are referred to the extensions for WSDL 1.1 that are provided in the WS-* support bundle as ``pyxb.bundles.wssplat.wsdl11.py``. An excerpt of the sort of thing done there is:: from pyxb.bundles.wssplat.raw.wsdl11 import * import pyxb.bundles.wssplat.raw.wsdl11 as raw_wsdl11 class tParam (raw_wsdl11.tParam): def __getMessageReference (self): return self.__messageReference def _setMessageReference (self, message_reference): self.__messageReference = message_reference __messageReference = None messageReference = property(__getMessageReference) raw_wsdl11.tParam._SetSupersedingClass(tParam) The first line brings in all the public identifiers from the generated binding. The second makes them available in a qualified form that ensures we use the generated value rather than the customized value. The class definition shows how to extend the generated bindings for the ``tParam`` complex type so that it has a field that can hold the instance of ``tMessage`` that was identified by the ``message`` attribute in an ``operation`` element. Following the class is a directive that tells PyXB to create instances of the customized class when automatically generating ``tParam`` instances from XML documents. To customize bindings, you will need to be familiar with the :py:obj:`pyxb.binding.basis._DynamicCreate_mixin` class. Be aware that :py:obj:`_SetSupersedingClass ` only affects the behavior of :py:obj:`Factory `, and does not change the Python inheritance tree. This means that the superseding class is only invoked when the content model requires an instance of the original type. When an instance of a subclass of a superseded class (that is not itself superseded) is needed by the content model, this infrastructure is bypassed, the normal Python inheritance mechanism takes control, and the instance will not be an instance of the superseding class. This will happen both when instances are created in Python directly and when they are created due to presence in the binding model. This is probably not what you will want, and to avoid it you must customize all subclasses of a customized class. A detailed example customization is in the :file:`examples/customization` subdirectory of the distribution. In particular, it shows how to introspect the binding model extracted from the generated Python module and programmatically create custom binding classes without manually reproducing the content hierarchy, making the customizing module more compact and stable. Generating Related Namespaces ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ The :ref:`pyxbgen--module-prefix` option permits you to add a fixed prefix to the generated modules. For example, when generating bindings for the OpenGIS schemas it is desirable to aggregate them into a Python module hierarchy so the imported name incorporates the namespace collection:: pyxbgen \ --schema-location=${SCHEMA_DIR}/gml/3.2.1/gml.xsd --module=gml_3_2 \ --schema-location=${SCHEMA_DIR}/iso/19139/20070417/gmd/gmd.xsd --module=iso19139.gmd \ --schema-location=${SCHEMA_DIR}/iso/19139/20070417/gts/gts.xsd --module=iso19139.gts \ --schema-location=${SCHEMA_DIR}/iso/19139/20070417/gsr/gsr.xsd --module=iso19139.gsr \ --schema-location=${SCHEMA_DIR}/iso/19139/20070417/gss/gss.xsd --module=iso19139.gss \ --schema-location=${SCHEMA_DIR}/iso/19139/20070417/gco/gco.xsd --module=iso19139.gco \ --module-prefix=opengis \ --archive-to-file=opengis/iso19139.core.wxs When generated this way, your Python code imports these modules with directives like:: import opengis.gml_3_2 as gml import opengis.iso19139.gmd PyXB comes with :ref:`pre-defined bundles ` for related namespaces in the ``pyxb.bundles`` module hierarchy. The command above is an excerpt from an early version of the script that generates the :ref:`OpenGIS ` bundles. See :ref:`Layout of a Bundle Directory ` for more information and the location of the current version of the script. Fine-Grained Namespace Control ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ In certain cases, schema developers will presume that it is within their purview to re-declare or extend the contents of namespaces that belong to others. Supporting this while preserving or re-using the original namespace contents requires finesse. For example, when generating the bindings for the OpenGIS `Sensor Observation Service `_, you would find that this service extends the ``http://www.opengis.net/ogc`` namespace, normally defined in the OpenGIS `Filter Encoding `_, with temporal operators that are defined in a local schema ``ogc4sos.xsd``. Because ``http://www.opengis.net/ogc`` is defined in a namespace archive, PyXB would normally assume that any ``import`` commands related to that namespace are redundant with the contents of that archive, and would ignore the import directive. In this case, that assumption is mistaken, and the ``ogc4sos.xsd`` schema must be read to define the additional elements and types. The required build command is:: pyxbgen \ --schema-location=${SCHEMA_DIR}/sos/1.0.0/sosAll.xsd --module sos_1_0 \ --archive-path=${ARCHIVE_DIR} \ --import-augmentable-namespace=http://www.opengis.net/ogc The :ref:`pyxbgen--import-augmentable-namespace` directive causes PyXB to allow import directives within the schema to add material to the content already loaded from an archive. Consequently, when reference to the ``ogc4sos.xsd`` schema is encountered, PyXB detects that, although it already has definitions for components in that namespace, this particular schema has not yet been read. PyXB reads the additional components, and generates bindings for the additional material into a private module ``_ogc`` which is then imported into the ``sos_1_0`` module. PyXB-1.2.6/doc/html/_sources/architecture.txt0000644000175000017500000000133313152762205020451 0ustar pabpab00000000000000************ Architecture ************ The architecture of PyXB requires an understanding of four models. :ref:`namespaces` describe how objects are aggregated by name and kind. The :ref:`componentModel` represents XML schema using the thirteen component types defined in the `XML schema specification `_. The :ref:`bindingModel` describes how Python classes provide a Pythonic representation of the information within specific components. Finally, the :ref:`contentModel` describes how the component model of a specific schema supports translation between XML documents and Python bindings. .. toctree:: :maxdepth: 2 arch_namespaces arch_component arch_binding arch_content PyXB-1.2.6/doc/html/_sources/pyxb.binding.txt0000644000175000017500000000236313152762205020366 0ustar pabpab00000000000000pyxb\.binding package ===================== Submodules ---------- pyxb\.binding\.basis module --------------------------- .. automodule:: pyxb.binding.basis :members: :undoc-members: :show-inheritance: pyxb\.binding\.content module ----------------------------- .. automodule:: pyxb.binding.content :members: :undoc-members: :show-inheritance: pyxb\.binding\.datatypes module ------------------------------- .. automodule:: pyxb.binding.datatypes :members: :undoc-members: :show-inheritance: pyxb\.binding\.facets module ---------------------------- .. automodule:: pyxb.binding.facets :members: :undoc-members: :show-inheritance: pyxb\.binding\.generate module ------------------------------ .. automodule:: pyxb.binding.generate :members: :undoc-members: :show-inheritance: pyxb\.binding\.saxer module --------------------------- .. automodule:: pyxb.binding.saxer :members: :undoc-members: :show-inheritance: pyxb\.binding\.xml\_ module --------------------------- .. automodule:: pyxb.binding.xml_ :members: :undoc-members: :show-inheritance: Module contents --------------- .. automodule:: pyxb.binding :members: :undoc-members: :show-inheritance: PyXB-1.2.6/doc/html/_sources/overview_how.txt0000644000175000017500000000662713152762205020525 0ustar pabpab00000000000000How to use it ============= Installation ------------ PyXB 1.2.x requires Python version 2.6 or higher (including 3.x as of PyXB 1.2.4). Among other things the implementation relies on decorators (:PEP:`318`) like ``@classref`` that are not present in earlier versions. The distribution is tested with the latest release in the Python version 2.6, 2.7, and 3.4 series prior to release. PyXB is distributed through `SourceForge `_. As of the 1.1.4 release, separated :ref:`bundles ` are no longer distributed. The `source distribution `_ includes pre-built bindings for the :ref:`common (core XML) `, :ref:`WS-* (web services) `, and :ref:`SAML (Security Assertion Markup Languge) ` bundles, as well as the user and API documentation. The :ref:`OpenGIS ` bundle infrastructure is present, but due to the size of the bindings and archives is not pre-built. Install in the usual manner:: python setup.py install You can test the distribution with:: python setup.py test which will run all the unit tests. Some of them will print warnings and other noise, but if at the end they all pass, don't worry about it. If you need more help with installation, see http://docs.python.org/install/index.html. Generating Bindings ------------------- The ``pyxbgen`` script is used to translate XML schema and WSDL documents into Python data bindings. There are two key components to generating bindings: - The URI to the definition of the data structures. This can be a URL, or a path to a local file. - The module path into which the binding will be installed. This is the path that users of the binding will import. There are many additional parameters; see :ref:`pyxbgen` and :ref:`pyxbgen-cli`. WSDL Functions -------------- The ``pyxbwsdl`` script is used to examine and operate on WSDL definition documents. In this release, it retrieves the WSDL document specified by the URI passed as an argument, and prints the available services with their operations and parameters. For example:: vmfed9[343]$ pyxbwsdl http://api.google.com/GoogleSearch.wsdl Need to dynamically create schema Importing pyxb.standard.bindings.soap Attempting to load a namespace from /home/pab/pyxb/dev/pyxb/standard/bindings/raw/wsdl.wxs Attempting to load a namespace from /home/pab/pyxb/dev/pyxb/standard/bindings/raw/soapenc.wxs Attempting to load a namespace from /home/pab/pyxb/dev/pyxb/standard/bindings/raw/soap.wxs Service: GoogleSearchService Port GoogleSearchPort at http://api.google.com/search/beta2 doGetCachedPage (at action=urn:GoogleSearchAction) Input: typens:doGetCachedPage Output: typens:doGetCachedPageResponse doSpellingSuggestion (at action=urn:GoogleSearchAction) Input: typens:doSpellingSuggestion Output: typens:doSpellingSuggestionResponse doGoogleSearch (at action=urn:GoogleSearchAction) Input: typens:doGoogleSearch Output: typens:doGoogleSearchResponse Currently, this is an unmaintained example. In the future, this script may provide a more powerful display of available services, and perhaps support for generating functions which interact with the service using the appropriate encoding. .. ignored ## Local Variables: ## fill-column:78 ## indent-tabs-mode:nil ## End: PyXB-1.2.6/doc/html/_sources/vision.txt0000644000175000017500000001307613152762205017305 0ustar pabpab00000000000000.. _pyxb_vision: PyXB Vision =========== .. note:: This historical document was written in early 2009 prior to PyXB development in order to bound the scope of the project and record the critical use cases. It has not been updated in response to lessons learned during development. PyXB is intended to support automated generation of Python language classes that conform in structure to data types defined with the W3C XML Schema. Origins ------- PyXB was developed to support interaction with arbitrary web services from Python. Service oriented architecture, specifically in the form of web services, has gained much traction in recent years. While languages like Java and C++ have a variety of commmercial, free, and open source utilities to help bridge the gap between web service standards and software, Python has been much less developed. Built-in support is limited to processing of XML documents. Some external packages are available to support SOAP and WSDL, but they were found to be unsatisfactory for a variety of reasons, both an inability to process complex schema like those for KML or SAML and a Python interface that was not natural. generateDS ^^^^^^^^^^ Reliance on a SAX processor, and use of a code generation scheme that was difficult to modify, made the code difficult to work with. It seemed infeasible to extend the implementation to support Pythonic schema bindings that used different styles. ZSI ^^^ This system supports generation of bindings that allow web services to be invoked, but XML schema support is secondary to SOAP and WSDL. Design Goals ------------ PyXB must be able to process the schema used to describe standard web services documents, including but not limited to the following namespaces: - [XMLSchema] - [wsdl] - [soap] - [soap bindings] - [http bindings] - [mime bindings] Standard conformance is a high priority. In addition to official standards such as those from W3C and OASIS, industry prevalence should guide selection among conflicting standards. This applies not only to standards that are supported by PyXB, but those used in its development. Python data structures bound to data types in these namespace should be as close as possible to those that would have been hand-written by a user. As an example, elements that may only appear once should correspond to fields with a object value; those that may appear multiple times should correspond to fields with an iterator value. Values recognized through a model group definition should be broken down into direct references to the underlying element (not passed through some intermediate structure). Speed of the resulting bindings when used within Python code is a secondary concern to usability of the bindings. Speed of conversion between bound objects and XML is a tertiary concern. The bindings must be able to generate Python objects corresponding to the data held within an XML document that validates against the schema from which the bindings were derived. The bindings must be able to generate XML that conforms to the schema from which they were derived. A facility must be provided through which custom behavior can be attached to the Python objects derived from PyXB. PyXB should support generating a module on a per-namespace basis. The module should include the necessary information to process schemas that depend on the namespace, as well as bindings for the namespace. Modules supporting the namespaces listed above should be provided along with PyXB. It should be possible for users to dynamically add available namespaces. It should be possible to customize the generated binding code. It is a goal to allow PyXB to generate code for other languages, though the capabilities of that code may be inherently limited or require additional tools. .. The intent here is that we might want to generate C++ bindings, but may rely on Python serialization to hold the descriptions of data types from the schema, thus requiring that facility to be supported outside of PyXB. PyXB and its generated bindings must work with a relatively current Python 2.x installation. Bindings generated by PyXB must require no packages or external programs except those that come as part of a standard Python distribution. At a minimum, bindings must be supported by Python distributions 2.3 and later. While the generated bindings should not require additional packages, they should allow use of such packages when available. For example, use in a system that provided a high-speed DOM implementation that would improve performance should not be excluded. PyXB itself should require no additional Python packages except those that come as part of a standard Python package. There may be additional functionality that is supported when certain packages are available. At a minimum, PyXB SHOULD run under Python version 2.4 and later. It is acceptable to require that the schemas processed by PyXB validate against the W3C specification. PyXB is not itself required to perform any validation. Given an invalid schema, PyXB SHOULD provide a diagnostic indicating any fault that prevents processing of the schema. It is not required that generated bindings support validation of instance documents. This function may be added through a customized binding generator. It should be possible to implement PyXB in terms of the bindings it generates from the XMLSchema namespace. At least conceptually. The licensing of PyXB and code it generates should be consistent with the Open Source Definition. An exception is acceptable for material produced by a custom generator that does not incorporate PyXB material in its output. PyXB-1.2.6/doc/html/_sources/related.txt0000644000175000017500000000260013152762205017405 0ustar pabpab00000000000000.. _pyxb_related: Related Packages ================ The following packages may be useful as an alternative to or used in conjunction with PyXB: - The `Zolera SOAP Infrastructure `_ is the backbone of the `Python Web Services `_ project. It is specifically intended to support web service interaction with SOAP and WSDL. The primary purpose of ZSI is SOAP, but it generates bindings for some XML Schema constructs. The last release of ZSI appears to have been in 2007, so much of this paragraph could be reworded to be in the past tense. - `generateDS `_ is an alternative package that is intended to do the same general thing as PyXB, though it uses a very different approach for extending bindings. generateDS is still under active development/maintenance. - The `Amara XML Toolkit `_ appears to be a fairly complete set of XML tools for Python evolved from the `4Suite `_ infrastructure. Amara supports `binding an object to an existing XML document `_ and has references to `RELAX NG `_ and `Schematron `_, but does not address `XML Schema `_. PyXB-1.2.6/doc/html/_sources/pyxb.utils.txt0000644000175000017500000000346013152762205020113 0ustar pabpab00000000000000pyxb\.utils package =================== Submodules ---------- pyxb\.utils\.activestate module ------------------------------- .. automodule:: pyxb.utils.activestate :members: :undoc-members: :show-inheritance: pyxb\.utils\.domutils module ---------------------------- .. automodule:: pyxb.utils.domutils :members: :undoc-members: :show-inheritance: pyxb\.utils\.fac module ----------------------- .. automodule:: pyxb.utils.fac :members: :undoc-members: :show-inheritance: pyxb\.utils\.saxdom module -------------------------- .. automodule:: pyxb.utils.saxdom :members: :undoc-members: :show-inheritance: pyxb\.utils\.saxutils module ---------------------------- .. automodule:: pyxb.utils.saxutils :members: :undoc-members: :show-inheritance: pyxb\.utils\.six module ----------------------- .. automodule:: pyxb.utils.six :members: :undoc-members: :show-inheritance: pyxb\.utils\.templates module ----------------------------- .. automodule:: pyxb.utils.templates :members: :undoc-members: :show-inheritance: pyxb\.utils\.unicode module --------------------------- .. automodule:: pyxb.utils.unicode :members: :undoc-members: :show-inheritance: pyxb\.utils\.unicode\_data module --------------------------------- .. automodule:: pyxb.utils.unicode_data :members: :undoc-members: :show-inheritance: pyxb\.utils\.utility module --------------------------- .. automodule:: pyxb.utils.utility :members: :undoc-members: :show-inheritance: pyxb\.utils\.xmlre module ------------------------- .. automodule:: pyxb.utils.xmlre :members: :undoc-members: :show-inheritance: Module contents --------------- .. automodule:: pyxb.utils :members: :undoc-members: :show-inheritance: PyXB-1.2.6/doc/html/_sources/pyxb.txt0000644000175000017500000000066613152762205016761 0ustar pabpab00000000000000pyxb package ============ .. automodule:: pyxb subpackages ----------- .. toctree:: pyxb.binding pyxb.namespace pyxb.utils pyxb.xmlschema Submodules ---------- pyxb\.exceptions\_ module ------------------------- .. automodule:: pyxb.exceptions_ :members: :undoc-members: :show-inheritance: Module contents --------------- .. automodule:: pyxb :members: :undoc-members: :show-inheritance: PyXB-1.2.6/doc/html/_sources/releases.txt0000644000175000017500000010441013152762205017572 0ustar pabpab00000000000000.. _releases: *************** Release History *************** Historically, the release number of PyXB indicated stability in a way similar to that of Linux several years ago, with even/odd of the middle digit indicating stability/development. That policy ended as of 1.1.3, and the relaxed policy is: - All releases consist of three non-negative integers - A release *series* refers to all releases with the same first two integers. The third integer indicates an incremental update to the system. - Should it be necessary to make wholesale changes that affect either stability or interface, the second or even first integer will be incremented - Critical bug fixes may result in new releases in older series, but this is expected to be extremely unusual. Such fixes will be made on a branch of the :ref:`git repository `. - All packaged releases are intended to be of comparable stability, with bug fixes and most enhancements causing an increment in the third integer As examples, :ticket:`correcting the content model for weak determinism <112>` resulted in PyXB 1.2.0, and :ticket:`support of Python 3 <150>` was completed in PyXB 1.2.4. :ticket:`support for XML Schema 1.1 <217>` will not be addressed until PyXB 1.3.0 if at all. 1.2.x ===== The 1.2.x release series introduces a new content model which provides much more help in resolving validation errors. Concurrent with this support was dropped for Python 2.4 and 2.5. The 1.2.x release works with Python 2.6 and 2.7 and as of PyXB 1.2.4 also with Python 3.1 and later. Some unit tests are skipped under Python 2.6 due to insufficient support for validating exception attributes. .. _pyxb-1.2.6: 1.2.6 (04 Sep 2017) ------------------- This is a roll-up aggregating all fixes since the last major release one year ago. Release testing has been performed with Python 2.7.12, 3.4.7, 3.5.4, and 3.6.2. Behavioral changes: - Overriding the DOM implementation via `PYXB_XML_STYLE` is deprecated. See :issue:`87`. The following reported `defects/enhancements `_ have been addressed: - Examples were not in the test suite. :issue:`61` - Disallow setting an empty namespace prefix. :issue:`66` - Support unicode identifiers under Python 3. :issue:`67` - Do not use default value when constructing empty scalar values. :issue:`71` - Defer validation when type is not yet available. :issue:`72` - Correct validation of fixed values from XML. :issue:`73` - Remove GPL code from PyXB. :issue:`77` - Fix identification of restricted complex type. :issue:`78` - Discard schema elements that cannot produce content. :issue:`79` - Demonstrate use of overriding built-in bindings so XHTML model groups can be referenced. :issue:`81` .. _pyxb-1.2.5: 1.2.5 (18 Sep 2016) ------------------- Documentation: http://pyxb.sourceforge.net/PyXB-1.2.5 This is a roll-up aggregating all fixes since the last major release nearly two years ago. The following reported `defects/enhancements `_ have been addressed: - Deconflict class properties from module identifiers. :issue:`27` - Correct handling of `xsi:type `_ on non-abstract types. :issue:`32` - Fix generation of zero-span durations. :issue:`38` - Document how to use file URIs on Windows. :issue:`34` - Document need for common bindings when generating OpenGIS bindings. :issue:`28` - Fix literal representation of not-a-number and infinite values. :issue:`43` - Document that Python 3 is supported. :issue:`36` - Fix processing of empty binary data tpyes. :issue:`51` - Fix transition sort key to support Python 3. :issue:`52` - Fix generation of modules that cannot be imported due to use of invalid characters in the module path. :issue:`48` - Add a method to xsd.base64Binary to allow a heavy-weight validation step to be bypassed. :issue:`50` .. _pyxb-1.2.4: 1.2.4 (19 Oct 2014) ------------------- Documentation: http://pyxb.sourceforge.net/PyXB-1.2.4 The major feature of this release is a new approach to Python 3 support based on the `six `_ module. This resolves :ticket:`support for Python 3 <150>` and allows one release of PyXB to support Python versions from 2.6 through 3.4, excluding 3.0. The ``maintainer/2to3`` script used in PyXB 1.2.3 is no longer supported. Both the core implementation and the bindings are compatible with Python 2 and 3. A second important feature was correct handling of QName by changing the binding representation from a string to an expanded name that saves the namespace URI rather than the prefix from the original document. Finally, with this release primary development and support moves from SourceForge to `Github `_. Inter-release updates will be made first on github (on the `next `_ branch), and pushed to the SourceForge git repository aperiodically. Other miscellanous changes: - Correct rich comparisons for _PluralBinding instances. :ticket:`218` - Prevent adding non-element content as wildcard elements. :ticket:`219` - Provide public API to _CF_enumeration helper methods. :ticket:`221` - Specify requirements for an acceptable DOM implementation. :ticket:`224` - Rebase xs:decimal on Python decimal.Decimal to provide high precision support. :ticket:`91` - Support Python 3. :ticket:`150` - Fix mis-ordered attribute groups use/resolution issue. :ticket:`230` - Generate facet values that are valid Python expressions. :ticket:`231` - Improve validation failure location for simple values. :ticket:`232` - Disallow name attribute in internal complex types. :issue:`6` - Avoid unbounded non-deterministic expansion. :issue:`5` - Reduce namespace intrusion with enumeration types. :issue:`9` - Add API to replace simple content complex type values. :issue:`7` - Fix representation and use of QNames. :issue:`13` - Fix generation of wildcard attributes. :issue:`14` - Fix validation of wildcard types in DOM instances. :issue:`15` - Reference github for bug reports. :issue:`16`: - Eliminate a gratuitous log warning on a validation failure. :issue:`17` - Eliminate improper assertion on extension binding use of imported bindings. :issue:`18` - Support serialization of anonymous namespaces to allow Python copy.deepcopy module to work on binding instances. :issue:`19` - Generate bindings that are compatible with both Python 2 and Python 3. :issue:`22` .. _pyxb-1.2.3: 1.2.3 (18 Sep 2013) ------------------- Documentation: http://pyxb.sourceforge.net/PyXB-1.2.3 This is primarily a bug-fix and clean-up release. One new feature is that starting with this release a Python 3 compatible version of PyXB will be available in the git repository. For this version, it may be obtained by:: git clone -b python3/pyxb-1.2.3 git://git.code.sf.net/p/pyxb/code pyxb3-1.2.3 The Python 3 code in this branch is created by automatic conversion of the Python 2 code using the maintainer/2to3 script. While not officially supported until PyXB 1.3.0, Python 3 appears to work correctly with this version. Behavioral changes: - PyXB 1.2.1 automatically filled in the content of fixed elements. This generated invalid documents when the particular element should have been absent for some content. The feature has been removed so fixed elements initialize to absent just like every other element. - The former `--pre-load-archives` option to pyxbgen has been removed and replaced by :ref:`pyxbgen--import-augmentable-namespace` which has more consistent semantics. Schema import directives related to a non-augmentable namespace (one for which the referenced option has not been provided) will be ignored if content for the namespace can be located in any archive or builtin. - Generating DOM (or XML) expressions of bindings that were created by type constructors and not associated with elements now cause an exception to be raised rather than mis-using the type name as though it were a valid element tag. Code cleanup: - Trailing whitespace throughout the source has been removed to decrease git complaints and non-reproducible patches. - Several coding practices that would not work under Python3 have been replaced with new solutions. The following reported `defects/enhancements `_ have been addressed: - Fix DOM style handling of xsi:type attribute. :ticket:`166` - Fix problems with nillable simple types. :ticket:`200` - Fix problems inserting into plural element attributes. :ticket:`201` - Correct namespace-qualified attributes. :ticket:`202` - Eliminate automatic derivation of XML element tag from binding type when converting an element-free instance to DOM. :ticket:`203` - Eliminate default to fixed value for elements. :ticket:`204` - Re-word exception when element content was incompatible with fixed value. :ticket:`205` - Fix the aslocal() method for xs:dateTime values with non-UTC timezones. :ticket:`206` - Fix values for restricted duration ranges in pickled data such as namespace archives. :ticket:`207` - Correct the interpretation of QName-valued base and similar attributes with respect to in-scope namespace declarations. :ticket:`208` - Rework how to specify that imported namespaces should be processed to extend the content model. :ticket:`209` - Removed redundant code in pyxbgen relevant to :ref:`pyxbgen--wsdl-location`. :ticket:`210` - Refine diagnostics when an element with simple type appears in a context that expects non-element content. :ticket:`211` - Add :py:obj:`pyxb.NonElementContent` to simplify access to non-element content in a mixed-content instance. :ticket:`212` - Convert assert failures to diagnostic exceptions when generating DOM expressions of complex types with simple content where the content is missing. :ticket:`213` - Ensure attribute values are converted from lexical space to value space when assigned from an XML representation. :ticket:`216` .. _pyxb-1.2.2: 1.2.2 (17 Apr 2013) ------------------- Documentation: http://pyxb.sourceforge.net/PyXB-1.2.2 Almost all changes are bug fixes, including issues with element order when extending types, name conflicts between XML and Python entities in the binding, and unicode problems in diagnostics. PyXB has never intentionally supported using bindings generated by different versions of PyXB. This will be enforced from version 1.2.2 onwards. The following reported `defects/enhancements `_ have been addressed: - Correct management of changes to default namespace within documents. :ticket:`183` - Do not interleave base and extension type elements. :ticket:`184` - Incorrect character range management resulted in regex failure. :ticket:`186` - Wide unicode mis-defines XML1p0e2 Char class. :ticket:`187` - Improve contents of StructuralBadDocumentError. :ticket:`189` - Generate exception details correctly with unicode content. :ticket:`190` - Namespace must be a reserved symbol within CTD instances. - PyXB rejects restriction that changes element type. :ticket:`193` - Multiple cases where names (from imported bindings, namespaces, and top-level classes and elements) resulted in conflicts with other top-level and class-level names. :ticket:`191`, :ticket:`194`, :ticket:`197` - Avoid validating content of simple types marked with xsi:nil. :ticket:`195` - Validate handling of attribute and element form attributes. :ticket:`196` - Ensure all referenced namespaces are imported into a binding. :ticket:`198` - Detect import of bindings generated by a different version of PyXB. :ticket:`199` .. _pyxb-1.2.1: 1.2.1 (17 Dec 2012) ------------------- Documentation: http://pyxb.sourceforge.net/PyXB-1.2.1 .. warning:: This release has an interface change: the :py:obj:`content ` method on complex types is now deprecated in favor of the :py:obj:`orderedContent ` method. The members in the new list have wrapper classes to correctly associate instance bindings with the element declaration and to distinguish instances with string values from non-element character data. The old method is supported for this release, but will produce a warning when used, and is likely to be removed in the next release. Key features of the release: - Full support for mixed content schema through a new method :py:obj:`orderedContent ` on complex binding instances and flags that control when that list affects document generation. See :ref:`mixed_content`. This is particularly relevant to XHTML. - Immediate validation of values assigned to plural elements. - A first step to providing finer control of validation, using :py:obj:`pyxb.ValidationConfig` The following reported `defects/enhancements `_ have been addressed: - Validate :ref:`pyxb.BIND` at point of use. :ticket:`69` - Issues with renamed element (most of which were mis-use of pyxb.BIND). :ticket:`71` - Support for default and fixed values in elements. :ticket:`99` - Support for mixed content. :ticket:`153`, :ticket:`154` - Provide an example based on a `help-forum thread `_ to show how to take advantage of PyXB 1.2.x improved diagnostics. :ticket:`158` - Improve interpretation of Python native type values when used in element constructors. :ticket:`175` - Add :ref:`ECMA-376 (Office Open XML)` as an optional bundle. :ticket:`178` - Fix invalid error when an all model group had minOccurs=0. :ticket:`179` - Add :ref:`Dublin Core` to the standard bundles. :ticket:`180` - Allow control of element order in generated documents. :ticket:`181` - Include wildcard elements in content. :ticket:`182` .. _pyxb-1.2.0: 1.2.0 (07 Nov 2012) ------------------- Documentation: http://pyxb.sourceforge.net/PyXB-1.2.0 This is a beta release intended to allow independent verification that the new content model works. It is released on SourceForge, but will not be made available through PyPI until such verification is satisfactory. Key feature of the release: - Use of an advanced content model which provides more accurate validation and :ref:`much better diagnostics ` when validation fails. - Elimination of support for Python 2.4 and 2.5 (necessary to ease the path to a future Python3 implementation of PyXB). - Complete rework of the exceptions that normally arise when using binding instances. These exceptions now provide information through attributes rather than a text message. The following reported `defects/enhancements `_ have been addressed: - Improved diagnostics. :ticket:`26`, :ticket:`75` - Correct handling of schema where greedy processing fails. :ticket:`112`, :ticket:`133` - Elements and attributes in generated bindings are emitted in a deterministic order sorted by schema and location within schema, to ensure deterministic processing and reduce variation between bindings when generation is repeated. :ticket:`164` - Make documentation annotations from schema available as documentation strings for the generated complex type bindings. :ticket:`79` - Update OpenGIS bindings to `use W3C XLink schema `_. :ticket:`165` 1.1.x ===== The 1.1.x release series entered maintenance mode with release 1.1.5. It is unlikely that further releases will occur, though critical bugs fixes may be made available in the `release branch `_. Bugs reported against 1.1.5 will generally be fixed in the 1.2.x series. .. _pyxb-1.1.5: 1.1.5 (01 Nov 2012) ------------------- Documentation: http://pyxb.sourceforge.net/PyXB-1.1.5 This is a maintenance release to finalize the 1.1.x series before starting the 1.2.x series. The following reported `defects/enhancements `_ have been addressed: - The standard Python logging module is now used. :ticket:`17`, :ticket:`159`, :ticket:`157` - The potential for changing binding style support has been removed. :ticket:`82` - PyPI/setuptools support has been fixed (again). :ticket:`130` - Unit test setup/teardown has been reviewed. :ticket:`149` - utf-8 is now used in all PyXB source files. :ticket:`151` - Preserve namespace mappings in deep-cloned instances. :ticket:`155` - Fix problems revealed by cython and pyflakes. :ticket:`156`, :ticket:`167` - User contributions from Jon Foster, with the exception of windows test scripts, have been incorporated. :ticket:`157` - Correct issues in generator function to retrieve command line. :ticket:`161` - Restore content of ExtraContentError exception. :ticket:`163` - Warn rather than abort when apparently redundant schema are included. :ticket:`169` .. _pyxb-1.1.4: 1.1.4 (15 Jun 2012) ------------------- Documentation: http://pyxb.sourceforge.net/PyXB-1.1.4 Key features of the release: - A large number of bug fixes, especially in the area of internationalization. Naive uses of unicode have mostly been eliminated. - Corrections and improvements to date and time-related types, especially with respect to timezones. - More namespaces have been added in the :ref:`common `, :ref:`WS-* `, and :ref:`OpenGIS ` bundles. - This release eliminates the separate packages for different bundles; all bundles and documentation except for OpenGIS are incorporated into the release file. OpenGIS is present but must be built manually; see :ref:`OpenGIS ` Examples have been added: - ``examples/customization`` shows advanced customization, including injecting behavior into binding classes corresponding to types from which other XML types are extended or restricted. It also demonstrates how to introspect the bindings within a module, automating much of the process of extending multiple bindings with the same functionality. - ``examples/unicode_jp`` demonstrates internationalization features including the ability to intercept PyXB's construction of Python identifiers from XML identifiers to produce meaningful identifiers when the schema language is not compatible with the Python 2 requirement that identifiers be ASCII. The following reported `defects/enhancements `_ have been addressed: - Timezone support for xsd:date types. :ticket:`102` - Pattern restriction does not work correctly with Unicode. :ticket:`108` - bad unvalidated generation with simple list. :ticket:`110` - Make simpleType CF_Enumeration iterable. :ticket:`111` - toxml fails when wildcard is in unrecognized namespace. :ticket:`114` - Problem with timedelta to duration conversion. :ticket:`115` - Simple-typed elements accept any attributes. :ticket:`116` - attributes are validated regardless of pyxb.RequireValidWhenParsing. :ticket:`117` - unable to resolve with absent namespace. :ticket:`119` - module CreateFromDocument ignores default_namespace. :ticket:`120` - PyXB elementary data types do not play well with copy/pickling/.... :ticket:`121` - PxXB should allow to assign None to optional elements and attributes. :ticket:`122` - unbound wildcard element toxml() fails. :ticket:`123` - misapplied allow_builtin_generation keyword in Generator. :ticket:`124` - attributes are not validated regardless of pyxb.RequireValidWhenGenerating. :ticket:`126` - dateTime objects must be timezone-aware. :ticket:`127` - most lexical representations for reduced dates wrong. :ticket:`128` - incorrect timezone adjustment from python values. :ticket:`129` - validate processing of unicode in assignments and documents. :ticket:`131` - Crash in PyXB when attempting to retrieve Unicode value from exception. :ticket:`132` - Name, NMTOKEN, NCName wrong validation regexes. :ticket:`134` - opengis/scripts/genbind removes all user files. :ticket:`135` - preserve timezone in processing. :ticket:`136` - wildcards rejected when validation disabled during parsing. :ticket:`137` - xsd.dateTime loses microsecond precision. :ticket:`138` - support alternative XML parsers. :ticket:`139` - need regular way to replace MakeIdentifier. :ticket:`141` - Document advanced customization. :ticket:`142` - cleanup OpenGIS schema bundle. :ticket:`143` - toxml needs encoding support. :ticket:`144` - mark encoding in generated output. :ticket:`146` - domutils references unqualified PyXB exceptions. :ticket:`148` .. _pyxb-1.1.3: 1.1.3 (09 Sep 2011) -------------------- Documentation: http://pyxb.sourceforge.net/PyXB-1.1.3 General cleanup, finish up a few previously unsupported datatypes. - Correct extension of a simple type with enumeration restrictions. :ticket:`89` - Use the Python string type as the basis for `xs:hexBinary `_. :ticket:`90` - Support ``+`` in ``PYXB_ARCHIVE_PATH`` like the documentation says. :ticket:`92` - Correct exception reference. :ticket:`93` - Correct handling of the `ur-type `_. :ticket:`94` - Automatically provide an `xsi:type `_ attribute when the schema uses the ur-type. :ticket:`95` - Implement `xs:base64binary `_. :ticket:`83`, :ticket:`96` - Fix pickling and URI path issues on Windows. :ticket:`97`, :ticket:`98` - Correct extensions that involve wildcards. :ticket:`100` - Do a better job resolving circular dependencies, and don't try to write two namespace groups to the same binding file. :ticket:`104`, :ticket:`105` - Add a bundle for :ref:`Security Assertion Markup Language `. Thanks to Michael van der Westhuizen for providing this (sixteen months ago). :ticket:`106` - Avoid overwrite of Python `built-in constants `_, including ``None``, ``True``, and ``False``. :ticket:`107` .. _pyxb-1.1.2: 1.1.2 (30 May 2010) ------------------- Documentation: http://pyxb.sourceforge.net/PyXB-1.1.2 Complete replacement of the model group portion of the content model. The NFA-to-DFA approach is gone. The resulting system does a better job in less space and significantly faster: 30% faster on the standard tmsxtvd test, orders of magnitude on documents with large sequences of optional elements. Note: A couple unit tests fail due to incidental reasons that will be addressed when fixing :ticket:`75`. Also, the architecture documentation for the validation portion of the content model is completely out of date. - Handle sequences of optional elements more effectively. :ticket:`33` - Correct multi-step attribute restriction/extension. :ticket:`80` - Support prefix rewrite for schema location URIs. :ticket:`81` - Fix syntax error generating wildcard namespace constraints. :ticket:`84` - Support whitespace validation bypass in simple type definitions. :ticket:`85` .. _pyxb-1.1.1: 1.1.1 (28 Jan 2010, rev 2135) ----------------------------- Documentation: http://pyxb.sourceforge.net/PyXB-1.1.1 Major feature is significantly improved ability to determine what content is not acceptable to the validating parser, and where it can be found in the document. See :ref:`invalid-content`. Also, using keyword parameters in binding instance constructors will now raise an :py:obj:`pyxb.exceptions_.ExtraContentError` in the case where the keyword does not correspond to the PyXB-generated identifier associated with an attribute or element of the class being instantiated. - Eliminate complaints about reference to deprecated :mod:`sha` module in Python 2.6. - Fix assorted problems with mixtures of :ref:`pyxbgen--binding-root`, :ref:`pyxbgen--module-prefix`, and :ref:`pyxbgen--write-for-customization`. :ticket:`64`, :ticket:`65` - Eliminate unnecessary attempts to download schema for builtin namespaces. :ticket:`63` - Avoid assertion failure when provided schema location's content looks a little, but not enough, like a schema document. :ticket:`72` - References to declarations in other namespaces are now calculated locally to the module, rather than cached under the expectation the name is valid everywhere. :ticket:`73` - Imposed consistency on behavior when document root element is not recognized. :ticket:`74` - Partial implementation of improved error data stored in exceptions. :ticket:`75` - Detect invalid keywords in instance constructor calls. :ticket:`76` .. _pyxb-1.1.0: 1.1.0 (30 Nov 2009, rev 2092) ----------------------------- Mostly nit-picky things, but some changed interface, so we're starting a new beta series. - Make handling of invalid xsi:type attributes more robust. :ticket:`56` - Use validation flags to control validation (what a novel concept). :ticket:`57` - Fix improper generation of content within elements marked as xsi:nil. :ticket:`58` - Provide mechanism to control default handling of xsi:type attributes in instance documents. :ticket:`60` - Fix bug where constraining facets were not inherited when deriving simple types by restriction. :ticket:`61` 1.0.x (Stable) ============== 1.0.0 (18 Oct 2009, rev 2068) ----------------------------- Nobody seems to have found anything critical for a while, and it does what I want it to, so we'll let this thing run free. - Replace a reference to a non-existent variable with something that works. :ticket:`52` - Consistently validate instances created from documents no matter which parser is used. :ticket:`53` - Support caching message references in WSDL SOAP faults. :ticket:`54` 0.7.x (Beta) ============ 0.7.3 (15 Sep 2009, rev 2050) ----------------------------- A few bug fixes (one major), a couple new features, and separation of the various components to allow a smaller distribution. - Fixed a circular reference in the DFA state classes that caused memory bloat in long-running processes. :ticket:`49` - When PyXB renames an XML element or attribute due to a collision with a reserved word, it will write a warning, and at runtime will raise an exception if an attempt is made to assign to the original name. :ticket:`50`, :ticket:`51` - Support for pattern restrictions for string-based simple types. :ticket:`47` - Split distribution into multiple files to reduce download size: - ``PyXB-base-@VERSION@.tar.gz`` -- Complete release, nothing pre-built - ``PyXB-doc-@VERSION@.tar.gz`` -- Overlay with pre-built documentation - ``PyXB-common-@VERSION@.tar.gz`` -- Overlay with XHTML bindings - ``PyXB-opengis-@VERSION@.tar.gz`` -- Overlay with OpenGIS bindings - ``PyXB-wsspat-@VERSION@.tar.gz`` -- Overlay with WS-* bindings - ``PyXB-full-@VERSION@.tar.gz`` -- Complete release with all overlays 0.7.2 (25 Aug 2009, rev 1981) ----------------------------- Primarily to fix a problem with chameleon schemas, but also a couple other minor issues. - References to QNames with absent namespaces in chameleon schema included into schema with a target namespace could not be resolved. :ticket:`46` - Documentation content was not correctly sanitized for use within a Python docstring. :ticket:`45`. - Elements with complex types with simple content that derived from string could not be marked as nil. :ticket:`48` 0.7.1 (23 Aug 2009, rev 1968) ----------------------------- None of the enhancements really got in, but lots of minor bug fixes. - Restored the ability to dump copies of all schemas retrieved from a remote location, so you can review them. :ticket:`28` - Fixed assorted problems with simple types constructed by list and union. :ticket:`35`, :ticket:`40` - Provide link from content values to the element binding that was used to store them. Useful for quickly identifying the owner element when generating a valid child sequence for conversion to DOM. :ticket:`36` - Fix validation of attributes with union types. :ticket:`37` - Enumeration fixes: Only generate class-level constants for enumerations that restrict a string representation (not double, float, etc). Verify enumerations work correctly on list and union constructions. Duplicate the class-level constants for enumerations that are defined in union member types. :ticket:`38` - Provide a facility to simplify the automatic creation of an instance of the appropriate type when storing values into an element. Makes life with anonymous local elements a lot easier. :ticket:`39` - Enhance management of namespace prefixes by allowing a system-wide default in BindingDOMSupport and by inferring the base name of the module as the default prefix for namespaces defined in imported bindings. :ticket:`41` - Provided crude facility to bypass validation when generating and parsing documents. :ticket:`44` - Re-arrange the help for pyxbgen's arguments, and add a script to automatically generate the Sphinx tables for it. - Support bundles of related schemas/namespaces, currently wssplat (for WS-\*) and opengis (Geographic Information Systems). - Got the user-level documentation back up to where it might actually help somebody. 0.7.0 (03 Aug 2009, rev 1715) ----------------------------- This release is identical to 0.5.2 except that the binding interface has completely changed. All examples have been updated; the documentation will be updated later. Note that the code in PyXB itself has not changed, and is not going to change. However, properties produce an interface more natural to most Python programs, so that has become the default style. See the --binding-style parameter to pyxbgen if you want to change this. - Change the method of accessing elements and attributes in bindings from accessor methods (e.g., elt.attr(), elt.setAttr()) to properties (e.g., elt.attr). :ticket:`18` 0.5.x (Beta) ============ 0.5.2 (03 Aug 2009, rev 1706) ----------------------------- Mostly changes to namespaces in support of profiles and application schemas which extend other namespaces with special components, or have their own copies of somebody else's schemas, etc. See the pyxbgen private/public namespace switches. - Presence of nested choice model groups caused the plurality calculations to be wrong: some elements were dropped from the model, others were treated as lists when only one instance would be permitted. :ticket:`34` - Content accessor would return wrong value for elements with simple type of list variety. :ticket:`32` - Corrected handling of attributes when deriving complex types by restriction. :ticket:`27` - Added a source module for XML namespace (http://www.w3.org/XML/1998/namespace) with bindings linked to the built-in component model. :ticket:`23` - Fix inadequacies in namespace archive management. :ticket:`22` This is expected to be the last release in 0.5.x. 0.7.0 should follow soon thereafter, and only contain the change of default binding style from accessor to property. :ticket:`18` 0.5.1 (16 Jul 2009, rev 1502) ----------------------------- Fixed various problems with OpenGIS schemas, specifically dependency loops induced by attempting to keep binding components within modules identified by the schema they came from, and loss of bindings for one namespace due to its being overwritten by those for another. - The presence of a wildcard in a sequence or choice model group caused other elements to be lost in the binding. :ticket:`29` - Rework content verification to operate on binding instances rather than DOM nodes. :ticket:`24` - Use `value()` to extract the value of a complex type with simple content; the `content()` method works only with element and mixed content. :ticket:`21` - Add support to specify prefix to be used in QNames when generating DOM documents from binding instances. Provide facility to re-use the BindingDOMSupport instance for multiple conversions. :ticket:`15` - Tightened requirements on content type matching: no more will strings and numbers automatically be converted to match the content model (probably for a branch you didn't intend). :ticket:`14` - Fix problems overwriting binding modules with data from a different set of namespaces. :ticket:`31`. - Eliminated the schema group modules: too hard to avoid dependency loops. Now all components are written into a single module, which is a namespace group module if the components cross namespaces. A namespace-specific module still exists, and imports only the relevant components from the group module. 0.5.0 (07 Jul 2009, rev 1446) ----------------------------- Ability to parse many of the OpenGIS schemas (gml, iso19139, citygml, ogc, ogckml22, om, ows, sensorML, sos, swe, tml, ...). - Completely rework include and import directives to correctly handle relative paths in ``schemaLocation`` attributes and to only import from a given location once per namespace. :ticket:`9`, :ticket:`8`, :ticket:`5` - Parse ``final`` attribute on type definitions (though this has no effect on the bindings). :ticket:`10` - Complete missing implementations in complex types with simple content. :ticket:`6` - Create new code generation model which supports inter-namespace and inter-schema dependency cycles. Namespace archives can now holds all namespaces that depend on each other. - Other miscellaneous. :ticket:`11` - Did I mention the ability to handle OpenGIS? :ticket:`16` Beware: - Most of the classes in the new code generation model are undocumented. - The interface to `pyxbgen` has changed completely. Look at ``examples/OpenGIS/makebind.sh`` or other scripts in the ``examples`` directory. 0.4.x (Stable) ============== 0.4.0 (20 Jun 2009, rev 1204) ----------------------------- First usable public release. - Use expanded names for all declarations and definitions. :ticket:`1` - Use the finite automaton content model for generation as well as parsing. :ticket:`2` - Support xsi:type and xsi:nil. :ticket:`3` - Support substitution groups. :ticket:`4` - Fix many problems in QName resolution - Implement the remaining date/time types - Rework content model so binding instances are always instances of the binding for the corresponding XML type, with no intervening element instance - Add support for SAX parser 0.2.x (Stable) ============== 0.2.0 (30 May 2009, rev 818) ---------------------------- - Initial public release .. ignored ## Local Variables: ## fill-column:78 ## indent-tabs-mode:nil ## End: PyXB-1.2.6/doc/html/_sources/arch_namespaces.txt0000644000175000017500000003734013152762205021112 0ustar pabpab00000000000000.. _namespaces: Namespaces ========== The most important concept to understand when working with complex XML documents is the `namespace `_. A namespace is nothing more than a map from names to objects, partitioned into groups within which the names must uniquely identify an object. A namespace is identified by its name, which is a `URI `_. Although it is common to use URIs like ``http://www.w3.org/2001/XMLSchema`` as namespace names, the name is simply an opaque identifier: it does not have to resolve to a Web site or anything helpful. ``dinner:ParsnipsOnTuesday`` is a perfectly valid namespace name. Equally, namespaces and XML schemas are not the same thing. A schema is simply a mechanism for specifying the contents of a namespace. It is common to use the ``include`` directive in XMLSchema to combine multiple schema into a single namespace. It is less common, though equally valid, to use ``xmlns`` or ``xs:schemaLocation`` to select alternative schemas to use for the same namespace in different instance documents, as in the `dangling type `_ pattern. This diagram shows the class structure of the PyXB namespace infrastructure. The central object is the :py:obj:`pyxb.namespace.Namespace`. Four mix-in classes provide implementations of separate namespace functions. :py:obj:`pyxb.namespace.ExpandedName` is used ubiquitously to pair local names with their namespaces. :py:obj:`pyxb.namespace.NamedObjectMap` maps names to the objects (generally, schema components) for a particular category of object. The :py:obj:`pyxb.namespace.NamespaceContext` class provides information related to the use of namespaces in XML documents, including mappings from prefixes to namespaces. .. image:: Images/NamespaceCore.jpg Namespace Category Maps ----------------------- The :py:obj:`pyxb.namespace._NamespaceCategory_mixin` provides support for discrete categories of named objects. It allows arbitrary, runtime-identified, groups of objects to be registered in individual dictionaries within the namespace. For example, XML Schema require that type definitions, element declarations, and attribute declarations be distinct categories of named objects in a namespace. PyXB also maintains separate categories for attribute groups, model groups, identity constraint definitions, and notation declarations, which also must be unique within their category. Other groups of objects can be stored in a namespace. For example, the WSDL definition of a service may choose to use the same namespace name for its types as for its definitions, adding services, ports, messages, bindings, and portTypes as named objects that can be identified. Namespace Component Associations -------------------------------- The :py:obj:`pyxb.namespace._NamespaceComponentAssociation_mixin` provides support for associating schema components with a namespace. Of particular interest is that a namespace can be comprised of components defined from multiple sources (generally, distinct schema documents). In addition, there are anonymous components (e.g., complex types defined within element members of complex types) which are implicitly associated with the namespace although they cannot be named within it. These must all be stored within the namespace so that a complete set of bindings can be generated in a single Python module. .. _resolution: Namespace Resolution -------------------- Named objects are often associated with namespaces through XML elements in a document. For example:: specifies an attribute declaration. In turn, references to names appear within XML elements, usually as values of specific attributes. The ``type`` portion of the attribute declaration above also identifies an object by name, and it must be possible to resolve the named object. The work involved in associating names with schema components is encapsulated in the :py:obj:`pyxb.namespace.resolution._NamespaceResolution_mixin` class. The following `concepts `_ are important to understand: - An `NCName `_ ("no-colon name") is an identifier, specifically one without any colon (":") characters, serving as a local name. - A `QName `_ ("qualified name") is an local name with an optional prefix, separated from it by a colon, which identifies a context for the local name. - The prefix is mapped using `xmlns `_ attributes to a namespace name, which is a URI. - The combination of a namespace URI and the local name comprise an `expanded namespace name `_, which is represented by :py:obj:`pyxb.namespace.ExpandedName`. - The category within which the local name must be resolved in the namespace is determined through external information, in the above case the fact of the QName's appearance in a ``type`` attribute in an ``attribute`` declaration of an XML schema. .. index: pair: resolution; name pair: resolution; object (component) :py:obj:`pyxb.namespace._NamespaceCategory_mixin` is used to define the set of categories supported by a namespace and to add named objects to those categories. A name is **resolved** when the object with which it is associated has been identified. Objects are **resolved** when any names on which they depend have been resolved. :py:obj:`pyxb.namespace.resolution._NamespaceResolution_mixin` provides a mechanism to hold on to names that have been encountered but whose associated objects have not yet been resolved (perhaps because the named object on which they depend has not been defined). Because one named object (e.g., a model group definition) might require resolution of another (e.g., an element reference), resolution is an iterative process, implemented by :py:obj:`pyxb.namespace.resolution._NamespaceResolution_mixin.resolveDefinitions`, and executed when all named objects have been added to the namespace. It depends on :py:obj:`pyxb.namespace.resolution.NamespaceContext` to identify named objects using the :py:obj:`pyxb.namespace.resolution.NamespaceContext.interpretQName` method. Expanded Names -------------- An :py:obj:`pyxb.namespace.ExpandedName` instance couples a local name with (optionally) a namespace, resulting in a QName. This class also integrates with namespace categories, permitting lookup of the object with its name in a specific category by using the category name as a method. For example, the following two expressions are equivalent:: # Short-hand method en.typeDefinition() # Detailed equivalent en.namespace().categoryMap('typeDefinition').get(en.localName()) Both produce the type definition with the given name, or ``None`` if there is no such definition. The short-hand method interface works for any category defined within the expanded name's namespace; it is not limited to the standard set of component categories. Methods are also present to test whether the name matches a DOM node, and to retrieve the named attribute (if present) from a DOM node. In this version of PyXB, the hash codes and comparison methods for :py:obj:`ExpandedName ` have been overridden so that an expanded name with no namespace is treated equivalently to the string value of the local name. This simplified management of default namespace lookups in earlier versions of PyXB, but may no longer be necessary; reliance on this feature is discouraged. Namespace Context ----------------- `Namespaces in XML `_ specifies how the ``xmlns`` attributes are used to associate prefix strings with namespaces. The :py:obj:`pyxb.namespace.NamespaceContext` class supports this by associating with each node in a DOM document the contextual information extracted from ``xmlns`` and other namespace-relevant attributes. The namespace context consists of three main parts: - The `default namespace `_ specifies the namespace in which unqualified names are resolved. - The `target namespace `_ is the namespace into which new name-to-component associations will be recorded. - The `in-scope namespaces `_ of a DOM node are those which can be identified by a prefix applied to names that appear in the node. Methods are provided to define context on a per-node basis within a DOM structure, or to dynamically generate contexts based on parent contexts and local namespace declarations as needed when using the SAX parser. Other Concepts -------------- .. index:: pair: namespace; absent single: no namespace .. _absentNamespaces: Absent Namespaces ^^^^^^^^^^^^^^^^^ Some schemas fail to specify a default namespace, a target namespace, or both. These cases are described by the term "absent namespace"; sometimes it is said that an object for which the target namespace is absent is in "no namespace". If the target namespace for a schema is absent, we still need to be able to store things somewhere, so we represent the target namespace as a normal :py:obj:`pyxb.namespace.Namespace` instance, except that the associated URI is ``None``. If in the same schema there is no default namespace, the default namespace is assigned to be this absent (but valid) target namespace, so that QName resolution works. Absence of a target namespace is the only situation in which resolution can succeed without some sort of namespace declaration. The main effect of this is that some external handle on the Namespace instance must be retained, because the namespace cannot be identified in other contexts. PyXB supports this by defining a ``Namespace`` variable within each binding module, thus allowing access to the namespace instance via syntax like ``pyxb.bundles.wssplat.wsdl11.Namespace``. .. _namespaceStorage: Storage of Namespaces --------------------- In PyXB, when the :ref:`componentModel` is used to define various elements, attributes, and types by representing them in Python instances, those instance objects are stored in a :py:obj:`pyxb.namespace.Namespace` instance. In addition to generating code corresponding to those objects, it is possible to save the pre-computed objects into a file so that they can be referenced in other namespaces. PyXB uses the Python pickling infrastructure to store the namespace component model into a file in the same directory as the generated binding, but with a suffix ``.wxs``. When a schema is processed that refers to a namespace, the serialized component model for the namespace is read in so that the referring namespace can resolve types in it. .. _namespace-archive: The Namespace Archive Model ^^^^^^^^^^^^^^^^^^^^^^^^^^^ Recall that the contents of a namespace can be defined from multiple sources. While in the simplest cases the namespace is defined by combining components from one or more schemas, the set of schemas that define a namespace may be different for different documents. One way this is used is the `dangling types` pattern. Another not uncommon situation is to use a namespace `profile`, which is a subset of the full namespace intended for use in a particular application. For example, the Geography Markup Language defines three profiles denoted "GML-SF" for "simple features"; these profiles do not include the more complex structures that are needed for unusual situations. Finally, some use cases require that a namespace be extended with application-specific information provided in a schema that adds to rather than replaces the base namespace definition. As with profiles these extensions should be provided in separate Python modules, but unlike profiles the original binding must be imported separately to provide the application's perspective of the full namespace content. To support these cases, PyXB must: - Support distinct Python binding modules for one namespace (e.g., dangling type implementations and profiles) - Support shared Python binding modules for one namespace (e.g., a base namespace with application-specific extensions) - Ensure the component model for each binding module is retained within a single archive regardless of whether that component model is complete for the module's namespace Naive management of these multiple information sources will cause havoc, since namespaces do not allow multiple objects to share the same name. The relations of the various classes involved in storing namespace data are depicted in the following diagram: .. image:: Images/NamespaceArchive.jpg The namespace archive facility must support the following situations: - The archive stores the complete set of components for a single namespace (most common) - The archive stores components from multiple namespaces which are interdependent, but together completely define the expected contents of the namespaces - The archive stores a complete subset of the standard components of a namespace (the `profile` situation) - The archive extends a namespace with additional components, often required for a particular application. It is usually necessary to read another archive to determine the full namespace content. Because of interdependencies between namespaces stored in a single archive, archives are read as complete entities: i.e., from a single archive you cannot read the components corresponding to one namespace while ignoring those from another. The component model for a namespace is read from a namespace archive only when it is necessary to generate new bindings for a namespace that refers to it, through import or namespace declarations. The component model is defined by invoking the :py:obj:`pyxb.namespace.Namespace.validateComponentModel` method. Within an archive, each namespace can be marked as `private` or `public`. When the component model for a namespace is validated, all archives in which that namespace is present and marked `public` are read and integrated into the available component models. When an archive is read, namespaces in it that are marked `private` are also integrated into the component model. Prior to this integration, the namespace component model is validated, potentially requiring the load of other archives in which the namespace is marked `public`. The contents of the namespace archive are: - A set of :py:obj:`pyxb.namespace.archive._ModuleRecord` instances which identify namespaces and mark whether they are public or private in the archive. Each instance in turn contains (for namespace ``A``): - the set of :py:obj:`pyxb.namespace.archive._ObjectOrigin` instances which identify the origins for components that are defined in the archive. In turn, each of these origins identifies by category and name the objects that were defined by this origin and consequently are stored in the containing archive. Due to use of the `include `_ directive, multiple origins may be associated with a single module record - the set of :py:obj:`pyxb.namespace.Namespace` instances that were referenced by ``A``. This includes namespaces that were imported into one of the origin objects, as well as those that were incorporated simply through reference to an object in a declared namespace - The objects within the namespace that were defined by the various origins In addition to the raw component model, the namespace archive includes the names of the Python modules into which bindings for each namespace were generated. .. ignored ## Local Variables: ## fill-column:78 ## indent-tabs-mode:nil ## End: PyXB-1.2.6/doc/html/arch_content.html0000644000175000017500000006106413152762222016747 0ustar pabpab00000000000000 Content Model — PyXB 1.2.6 documentation

Content Model

PyXB’s content model is used to complete the link between the Component Model and the Binding Model. These classes are the ones that:

  • determine what Python class attribute is used to store which XML element or attribute;
  • distinguish those elements that can occur at most once from those that require an aggregation; and
  • ensure that the ordering and occurrence constraints imposed by the XML model group are satisfied, when XML is converted to Python instances and vice-versa.

Associating XML and Python Objects

Most of the classes involved in the content model are in the pyxb.binding.content module. The relations among these classes are displayed in the following diagram.

_images/ContentModel.jpg

In the standard code generation template, both element and attribute values are stored in Python class fields. As noted in Deconflicting Names it is necessary to ensure an attribute and an element which have the same name in their containing complex type have distinct names in the Python class corresponding to that type. Use information for each of these is maintained in the type class. This use information comprises:

  • the original name of the element/attribute in the XML
  • its deconflicted name in Python
  • the private name by which the value is stored in the Python instance dictionary

Other information is specific to the type of use. The pyxb.binding.basis.complexTypeDefinition retains maps from the component’s name the attribute use or element use instance corresponding to the component’s use.

Attribute Uses

The information associated with an attribute use is recorded in an pyxb.binding.content.AttributeUse instance. This class provides:

A map is used to map from expanded names to AttributeUse instances. This map is defined within the class definition itself.

Element Uses

The element analog to an attribute use is an element declaration, and the corresponding information is stored in a pyxb.binding.content.ElementDeclaration instance. This class provides:

A map is used to map from expanded names to ElementDeclaration instances. This map is defined within the class definition itself. As mentioned before, when the same element name appears at multiple places within the element content the uses are collapsed into a single attribute on the complex type; thus the map is to the ElementDeclaration, not the ElementUse.

Validating the Content Model

As of PyXB 1.2.0, content validation is performed using the Finite Automata with Counters (FAC) data structure, as described in Regular Expressions with Numerical Constraints and Automata with Counters, Dag Hovland, Lecture Notes in Computer Science, 2009, Volume 5684, Theoretical Aspects of Computing - ICTAC 2009, Pages 231-245.

This structure allows accurate validation of occurrence and order constraints without the complexity of the original back-tracking validation solution from PyXB 1.1.1 and earlier. It also avoids the incorrect rejection of valid documents that (rarely) occurred with the greedy algorithm introduced in PyXB 1.1.2. Conversion to this data structure also enabled the distinction between element declaration and element use nodes, allowing diagnostics to trace back to the element references in context.

The data structures for the automaton and the configuration structure that represents a processing automaton are:

_images/FACAutomaton.jpg

The implementation in PyXB is generally follows the description in the ICTAC 2009 paper. Calculation of first/follow sets has been enhanced to support term trees with more than two children per node. In addition, support for unordered catenation as required for the “all” model group is implemented by a state that maintains a distinct sub-automaton for each alternative, requiring a layered approach where executon of an automaton is suspended until the subordinate automaton has accepted and a transition out of it is encountered.

For more information on the implementation, please see the FAC module. This module has been written to be independent of PyXB infrastructure, and may be re-used in other code in accordance with the PyXB license.

FAC and the PyXB Content Model

As depicted in the Content Model class diagram each complex type binding class has a _Automaton which encodes the content model of the type as a Finite Automaton with Counters. This representation models the occurrence constraints and sub-element orders, referencing the specific element and wildcard uses as they appear in the schema. Each instance of a complex binding supports an AutomatonConfiguration that is used to validate the binding content against the model.

An ElementUse instance is provided as the metadata for automaton states that correspond an element declaration in the schema. Similarly, a WildcardUse instance is used as the metadata for automaton states that correspond to an instance of the xs:any wildcard schema component. Validation in the automaton delegates through the SymbolMatch_mixin interface to see whether content in the form of a complex type binding instance is conformant to the restrictions on symbols associated with a particular state.

When parsing, a transition taken results in the storage of the consumed symbol into the appropriate element attribute or wildcard list in the binding instance. In many cases, the transition from one state to a next is uniquely determined by the content; as long as this condition holds, the AutomatonConfiguration instance retains a single underlying FAC Configuration representing the current state.

To generate the XML corresponding to a binding instance, the element and wildcard content of the instance are loaded into a Python dictionary, keyed by the ElementDeclaration. These subordinate elements are appended to a list of child nodes as transitions that recognize them are encountered. As of PyXB 1.2.0 the first legal transition in the order imposed by the schema is taken, and there is no provision for influencing the order in the generated document when multiple orderings are valid.

PyXB-1.2.6/doc/html/vision.html0000644000175000017500000002731513152762225015613 0ustar pabpab00000000000000 PyXB Vision — PyXB 1.2.6 documentation

PyXB Vision

Note

This historical document was written in early 2009 prior to PyXB development in order to bound the scope of the project and record the critical use cases. It has not been updated in response to lessons learned during development.

PyXB is intended to support automated generation of Python language classes that conform in structure to data types defined with the W3C XML Schema.

Origins

PyXB was developed to support interaction with arbitrary web services from Python.

Service oriented architecture, specifically in the form of web services, has gained much traction in recent years. While languages like Java and C++ have a variety of commmercial, free, and open source utilities to help bridge the gap between web service standards and software, Python has been much less developed. Built-in support is limited to processing of XML documents.

Some external packages are available to support SOAP and WSDL, but they were found to be unsatisfactory for a variety of reasons, both an inability to process complex schema like those for KML or SAML and a Python interface that was not natural.

generateDS

Reliance on a SAX processor, and use of a code generation scheme that was difficult to modify, made the code difficult to work with. It seemed infeasible to extend the implementation to support Pythonic schema bindings that used different styles.

ZSI

This system supports generation of bindings that allow web services to be invoked, but XML schema support is secondary to SOAP and WSDL.

Design Goals

PyXB must be able to process the schema used to describe standard web services documents, including but not limited to the following namespaces:

  • [XMLSchema]
  • [wsdl]
  • [soap]
  • [soap bindings]
  • [http bindings]
  • [mime bindings]

Standard conformance is a high priority. In addition to official standards such as those from W3C and OASIS, industry prevalence should guide selection among conflicting standards. This applies not only to standards that are supported by PyXB, but those used in its development.

Python data structures bound to data types in these namespace should be as close as possible to those that would have been hand-written by a user. As an example, elements that may only appear once should correspond to fields with a object value; those that may appear multiple times should correspond to fields with an iterator value. Values recognized through a model group definition should be broken down into direct references to the underlying element (not passed through some intermediate structure).

Speed of the resulting bindings when used within Python code is a secondary concern to usability of the bindings. Speed of conversion between bound objects and XML is a tertiary concern.

The bindings must be able to generate Python objects corresponding to the data held within an XML document that validates against the schema from which the bindings were derived.

The bindings must be able to generate XML that conforms to the schema from which they were derived.

A facility must be provided through which custom behavior can be attached to the Python objects derived from PyXB.

PyXB should support generating a module on a per-namespace basis. The module should include the necessary information to process schemas that depend on the namespace, as well as bindings for the namespace. Modules supporting the namespaces listed above should be provided along with PyXB. It should be possible for users to dynamically add available namespaces.

It should be possible to customize the generated binding code. It is a goal to allow PyXB to generate code for other languages, though the capabilities of that code may be inherently limited or require additional tools.

PyXB and its generated bindings must work with a relatively current Python 2.x installation. Bindings generated by PyXB must require no packages or external programs except those that come as part of a standard Python distribution. At a minimum, bindings must be supported by Python distributions 2.3 and later.

While the generated bindings should not require additional packages, they should allow use of such packages when available. For example, use in a system that provided a high-speed DOM implementation that would improve performance should not be excluded.

PyXB itself should require no additional Python packages except those that come as part of a standard Python package. There may be additional functionality that is supported when certain packages are available. At a minimum, PyXB SHOULD run under Python version 2.4 and later.

It is acceptable to require that the schemas processed by PyXB validate against the W3C specification. PyXB is not itself required to perform any validation. Given an invalid schema, PyXB SHOULD provide a diagnostic indicating any fault that prevents processing of the schema.

It is not required that generated bindings support validation of instance documents. This function may be added through a customized binding generator.

It should be possible to implement PyXB in terms of the bindings it generates from the XMLSchema namespace. At least conceptually.

The licensing of PyXB and code it generates should be consistent with the Open Source Definition. An exception is acceptable for material produced by a custom generator that does not incorporate PyXB material in its output.

PyXB-1.2.6/doc/html/userref_index.html0000644000175000017500000002030613152762225017137 0ustar pabpab00000000000000 User Reference — PyXB 1.2.6 documentation PyXB-1.2.6/doc/html/_static/0000755000175000017500000000000013152762244015035 5ustar pabpab00000000000000PyXB-1.2.6/doc/html/_static/searchtools.js0000644000175000017500000006143213152762225017726 0ustar pabpab00000000000000/* * searchtools.js_t * ~~~~~~~~~~~~~~~~ * * Sphinx JavaScript utilities for the full-text search. * * :copyright: Copyright 2007-2017 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ /* Non-minified version JS is _stemmer.js if file is provided */ /** * Porter Stemmer */ var Stemmer = function() { var step2list = { ational: 'ate', tional: 'tion', enci: 'ence', anci: 'ance', izer: 'ize', bli: 'ble', alli: 'al', entli: 'ent', eli: 'e', ousli: 'ous', ization: 'ize', ation: 'ate', ator: 'ate', alism: 'al', iveness: 'ive', fulness: 'ful', ousness: 'ous', aliti: 'al', iviti: 'ive', biliti: 'ble', logi: 'log' }; var step3list = { icate: 'ic', ative: '', alize: 'al', iciti: 'ic', ical: 'ic', ful: '', ness: '' }; var c = "[^aeiou]"; // consonant var v = "[aeiouy]"; // vowel var C = c + "[^aeiouy]*"; // consonant sequence var V = v + "[aeiou]*"; // vowel sequence var mgr0 = "^(" + C + ")?" + V + C; // [C]VC... is m>0 var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 var s_v = "^(" + C + ")?" + v; // vowel in stem this.stemWord = function (w) { var stem; var suffix; var firstch; var origword = w; if (w.length < 3) return w; var re; var re2; var re3; var re4; firstch = w.substr(0,1); if (firstch == "y") w = firstch.toUpperCase() + w.substr(1); // Step 1a re = /^(.+?)(ss|i)es$/; re2 = /^(.+?)([^s])s$/; if (re.test(w)) w = w.replace(re,"$1$2"); else if (re2.test(w)) w = w.replace(re2,"$1$2"); // Step 1b re = /^(.+?)eed$/; re2 = /^(.+?)(ed|ing)$/; if (re.test(w)) { var fp = re.exec(w); re = new RegExp(mgr0); if (re.test(fp[1])) { re = /.$/; w = w.replace(re,""); } } else if (re2.test(w)) { var fp = re2.exec(w); stem = fp[1]; re2 = new RegExp(s_v); if (re2.test(stem)) { w = stem; re2 = /(at|bl|iz)$/; re3 = new RegExp("([^aeiouylsz])\\1$"); re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); if (re2.test(w)) w = w + "e"; else if (re3.test(w)) { re = /.$/; w = w.replace(re,""); } else if (re4.test(w)) w = w + "e"; } } // Step 1c re = /^(.+?)y$/; if (re.test(w)) { var fp = re.exec(w); stem = fp[1]; re = new RegExp(s_v); if (re.test(stem)) w = stem + "i"; } // Step 2 re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; if (re.test(w)) { var fp = re.exec(w); stem = fp[1]; suffix = fp[2]; re = new RegExp(mgr0); if (re.test(stem)) w = stem + step2list[suffix]; } // Step 3 re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; if (re.test(w)) { var fp = re.exec(w); stem = fp[1]; suffix = fp[2]; re = new RegExp(mgr0); if (re.test(stem)) w = stem + step3list[suffix]; } // Step 4 re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; re2 = /^(.+?)(s|t)(ion)$/; if (re.test(w)) { var fp = re.exec(w); stem = fp[1]; re = new RegExp(mgr1); if (re.test(stem)) w = stem; } else if (re2.test(w)) { var fp = re2.exec(w); stem = fp[1] + fp[2]; re2 = new RegExp(mgr1); if (re2.test(stem)) w = stem; } // Step 5 re = /^(.+?)e$/; if (re.test(w)) { var fp = re.exec(w); stem = fp[1]; re = new RegExp(mgr1); re2 = new RegExp(meq1); re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) w = stem; } re = /ll$/; re2 = new RegExp(mgr1); if (re.test(w) && re2.test(w)) { re = /.$/; w = w.replace(re,""); } // and turn initial Y back to y if (firstch == "y") w = firstch.toLowerCase() + w.substr(1); return w; } } /** * Simple result scoring code. */ var Scorer = { // Implement the following function to further tweak the score for each result // The function takes a result array [filename, title, anchor, descr, score] // and returns the new score. /* score: function(result) { return result[4]; }, */ // query matches the full name of an object objNameMatch: 11, // or matches in the last dotted part of the object name objPartialMatch: 6, // Additive scores depending on the priority of the object objPrio: {0: 15, // used to be importantResults 1: 5, // used to be objectResults 2: -5}, // used to be unimportantResults // Used when the priority is not in the mapping. objPrioDefault: 0, // query found in title title: 15, // query found in terms term: 5 }; var splitChars = (function() { var result = {}; var singles = [96, 180, 187, 191, 215, 247, 749, 885, 903, 907, 909, 930, 1014, 1648, 1748, 1809, 2416, 2473, 2481, 2526, 2601, 2609, 2612, 2615, 2653, 2702, 2706, 2729, 2737, 2740, 2857, 2865, 2868, 2910, 2928, 2948, 2961, 2971, 2973, 3085, 3089, 3113, 3124, 3213, 3217, 3241, 3252, 3295, 3341, 3345, 3369, 3506, 3516, 3633, 3715, 3721, 3736, 3744, 3748, 3750, 3756, 3761, 3781, 3912, 4239, 4347, 4681, 4695, 4697, 4745, 4785, 4799, 4801, 4823, 4881, 5760, 5901, 5997, 6313, 7405, 8024, 8026, 8028, 8030, 8117, 8125, 8133, 8181, 8468, 8485, 8487, 8489, 8494, 8527, 11311, 11359, 11687, 11695, 11703, 11711, 11719, 11727, 11735, 12448, 12539, 43010, 43014, 43019, 43587, 43696, 43713, 64286, 64297, 64311, 64317, 64319, 64322, 64325, 65141]; var i, j, start, end; for (i = 0; i < singles.length; i++) { result[singles[i]] = true; } var ranges = [[0, 47], [58, 64], [91, 94], [123, 169], [171, 177], [182, 184], [706, 709], [722, 735], [741, 747], [751, 879], [888, 889], [894, 901], [1154, 1161], [1318, 1328], [1367, 1368], [1370, 1376], [1416, 1487], [1515, 1519], [1523, 1568], [1611, 1631], [1642, 1645], [1750, 1764], [1767, 1773], [1789, 1790], [1792, 1807], [1840, 1868], [1958, 1968], [1970, 1983], [2027, 2035], [2038, 2041], [2043, 2047], [2070, 2073], [2075, 2083], [2085, 2087], [2089, 2307], [2362, 2364], [2366, 2383], [2385, 2391], [2402, 2405], [2419, 2424], [2432, 2436], [2445, 2446], [2449, 2450], [2483, 2485], [2490, 2492], [2494, 2509], [2511, 2523], [2530, 2533], [2546, 2547], [2554, 2564], [2571, 2574], [2577, 2578], [2618, 2648], [2655, 2661], [2672, 2673], [2677, 2692], [2746, 2748], [2750, 2767], [2769, 2783], [2786, 2789], [2800, 2820], [2829, 2830], [2833, 2834], [2874, 2876], [2878, 2907], [2914, 2917], [2930, 2946], [2955, 2957], [2966, 2968], [2976, 2978], [2981, 2983], [2987, 2989], [3002, 3023], [3025, 3045], [3059, 3076], [3130, 3132], [3134, 3159], [3162, 3167], [3170, 3173], [3184, 3191], [3199, 3204], [3258, 3260], [3262, 3293], [3298, 3301], [3312, 3332], [3386, 3388], [3390, 3423], [3426, 3429], [3446, 3449], [3456, 3460], [3479, 3481], [3518, 3519], [3527, 3584], [3636, 3647], [3655, 3663], [3674, 3712], [3717, 3718], [3723, 3724], [3726, 3731], [3752, 3753], [3764, 3772], [3774, 3775], [3783, 3791], [3802, 3803], [3806, 3839], [3841, 3871], [3892, 3903], [3949, 3975], [3980, 4095], [4139, 4158], [4170, 4175], [4182, 4185], [4190, 4192], [4194, 4196], [4199, 4205], [4209, 4212], [4226, 4237], [4250, 4255], [4294, 4303], [4349, 4351], [4686, 4687], [4702, 4703], [4750, 4751], [4790, 4791], [4806, 4807], [4886, 4887], [4955, 4968], [4989, 4991], [5008, 5023], [5109, 5120], [5741, 5742], [5787, 5791], [5867, 5869], [5873, 5887], [5906, 5919], [5938, 5951], [5970, 5983], [6001, 6015], [6068, 6102], [6104, 6107], [6109, 6111], [6122, 6127], [6138, 6159], [6170, 6175], [6264, 6271], [6315, 6319], [6390, 6399], [6429, 6469], [6510, 6511], [6517, 6527], [6572, 6592], [6600, 6607], [6619, 6655], [6679, 6687], [6741, 6783], [6794, 6799], [6810, 6822], [6824, 6916], [6964, 6980], [6988, 6991], [7002, 7042], [7073, 7085], [7098, 7167], [7204, 7231], [7242, 7244], [7294, 7400], [7410, 7423], [7616, 7679], [7958, 7959], [7966, 7967], [8006, 8007], [8014, 8015], [8062, 8063], [8127, 8129], [8141, 8143], [8148, 8149], [8156, 8159], [8173, 8177], [8189, 8303], [8306, 8307], [8314, 8318], [8330, 8335], [8341, 8449], [8451, 8454], [8456, 8457], [8470, 8472], [8478, 8483], [8506, 8507], [8512, 8516], [8522, 8525], [8586, 9311], [9372, 9449], [9472, 10101], [10132, 11263], [11493, 11498], [11503, 11516], [11518, 11519], [11558, 11567], [11622, 11630], [11632, 11647], [11671, 11679], [11743, 11822], [11824, 12292], [12296, 12320], [12330, 12336], [12342, 12343], [12349, 12352], [12439, 12444], [12544, 12548], [12590, 12592], [12687, 12689], [12694, 12703], [12728, 12783], [12800, 12831], [12842, 12880], [12896, 12927], [12938, 12976], [12992, 13311], [19894, 19967], [40908, 40959], [42125, 42191], [42238, 42239], [42509, 42511], [42540, 42559], [42592, 42593], [42607, 42622], [42648, 42655], [42736, 42774], [42784, 42785], [42889, 42890], [42893, 43002], [43043, 43055], [43062, 43071], [43124, 43137], [43188, 43215], [43226, 43249], [43256, 43258], [43260, 43263], [43302, 43311], [43335, 43359], [43389, 43395], [43443, 43470], [43482, 43519], [43561, 43583], [43596, 43599], [43610, 43615], [43639, 43641], [43643, 43647], [43698, 43700], [43703, 43704], [43710, 43711], [43715, 43738], [43742, 43967], [44003, 44015], [44026, 44031], [55204, 55215], [55239, 55242], [55292, 55295], [57344, 63743], [64046, 64047], [64110, 64111], [64218, 64255], [64263, 64274], [64280, 64284], [64434, 64466], [64830, 64847], [64912, 64913], [64968, 65007], [65020, 65135], [65277, 65295], [65306, 65312], [65339, 65344], [65371, 65381], [65471, 65473], [65480, 65481], [65488, 65489], [65496, 65497]]; for (i = 0; i < ranges.length; i++) { start = ranges[i][0]; end = ranges[i][1]; for (j = start; j <= end; j++) { result[j] = true; } } return result; })(); function splitQuery(query) { var result = []; var start = -1; for (var i = 0; i < query.length; i++) { if (splitChars[query.charCodeAt(i)]) { if (start !== -1) { result.push(query.slice(start, i)); start = -1; } } else if (start === -1) { start = i; } } if (start !== -1) { result.push(query.slice(start)); } return result; } /** * Search Module */ var Search = { _index : null, _queued_query : null, _pulse_status : -1, init : function() { var params = $.getQueryParameters(); if (params.q) { var query = params.q[0]; $('input[name="q"]')[0].value = query; this.performSearch(query); } }, loadIndex : function(url) { $.ajax({type: "GET", url: url, data: null, dataType: "script", cache: true, complete: function(jqxhr, textstatus) { if (textstatus != "success") { document.getElementById("searchindexloader").src = url; } }}); }, setIndex : function(index) { var q; this._index = index; if ((q = this._queued_query) !== null) { this._queued_query = null; Search.query(q); } }, hasIndex : function() { return this._index !== null; }, deferQuery : function(query) { this._queued_query = query; }, stopPulse : function() { this._pulse_status = 0; }, startPulse : function() { if (this._pulse_status >= 0) return; function pulse() { var i; Search._pulse_status = (Search._pulse_status + 1) % 4; var dotString = ''; for (i = 0; i < Search._pulse_status; i++) dotString += '.'; Search.dots.text(dotString); if (Search._pulse_status > -1) window.setTimeout(pulse, 500); } pulse(); }, /** * perform a search for something (or wait until index is loaded) */ performSearch : function(query) { // create the required interface elements this.out = $('#search-results'); this.title = $('

' + _('Searching') + '

').appendTo(this.out); this.dots = $('').appendTo(this.title); this.status = $('

').appendTo(this.out); this.output = $('